2009-06-24 19 views
13

Tengo la siguiente consulta dinámica que está funcionando bien sin la cláusula WHERE, que está esperando UNIQUEIDENTIFIER.T-SQL: ¿Cómo usar los parámetros en SQL dinámico?

Cuando lo transfiero, no obtengo un resultado. Intenté CAST y CONVERT, pero no produjo ningún resultado. Puede que lo esté haciendo mal, ¿alguien puede ayudar?

CREATE PROCEDURE [dbo].[sp_Test1] /* 'b0da56dc-fc73-4c0e-85f7-541e3e8f249d' */ 
(
@p_CreatedBy UNIQUEIDENTIFIER 
) 
AS 
DECLARE @sql NVARCHAR(4000) 
SET @sql =' 

DECLARE @p_CreatedBY UNIQUEIDENTIFIER 

SELECT 
    DateTime, 
    Subject, 
    CreatedBy 
FROM 
(
    SELECT 
    DateTime, Subject, CreatedBy, 
    ROW_NUMBER() OVER(ORDER BY DateTime) AS Indexing 
    FROM 
    ComposeMail 
    WHERE 
    CreatedBy = @p_CreatedBy /* <--- the problem is in this condition */ 
) AS NewDataTable 
' 

EXEC sp_executesql @sql 

Respuesta

22

Debe pasar los parámetros a sp_executesql. See MSDN for details.

... 
WHERE 
    CreatedBy = @p 
... 

EXECUTE sp_executesql @sql, N'@p UNIQUEIDENTIFIER', @p = @p_CreatedBY 
+0

intenté esto, no funciona, dándome el siguiente error "El procedimiento espera el parámetro '@parameters' de tipo 'ntext/nchar/nvarchar'." –

+3

Haga la cadena NCHAR agregando una 'N': EXECUTE sp_executesql @sql, N '@ p UNIQUEIDENTIFIER', ... –

0

no estoy seguro de si la variable se está poblada en formato de cadena o binario, pero puede que tenga que citar uniqueidentifier en su cláusula where. Si solo selecciona el campo identificador único, ¿vuelve como cadena o binario?

+0

Incluso intenté pasar el identificador único exacto con comillas, pero está dando una sintaxis incorrecta cuando lo estoy haciendo. cualquier ejemplo de cómo hacer esto. –

+0

espere un minuto ... ¿no necesita poner el nombre var fuera de las comillas? entonces a lo largo de las líneas de DÓNDE CreatedBy = '+ @p_CreatedBy +') Creo que de esa manera realmente pone la cadena literal en el sql. –

3
DECLARE @ParmDefinition NVARCHAR(500) 
SET @ParmDefinition = '@p_CreatedBy UNIQUEIDENTIFIER' 

EXEC sp_executesql @sql, @ParmDefinition, @p_CreatedBy = @p_CreatedBy 
Cuestiones relacionadas