2009-06-24 12 views
13

Ho la seguente query dinamica che funziona correttamente senza la clausola WHERE, che è in attesa di UNIQUEIDENTIFIER.T-SQL: come utilizzare i parametri in SQL dinamico?

Quando lo inoltro, non ottengo un risultato. Ho provato CAST e CONVERT, ma nessun risultato. Potrei sbagliarmi, qualcuno può aiutarti?

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 

risposta

22

È necessario passare i parametri a sp_executesql. See MSDN for details.

... 
WHERE 
    CreatedBy = @p 
... 

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

ho provato questo, non funziona dandomi l'errore di followig "La procedura si aspetta parametro '@parameters' di tipo 'ntext/nchar/nvarchar'." –

+3

Rendi la stringa NCHAR aggiungendo una "N": EXECUTE sp_executesql @sql, N '@ p UNIQUEIDENTIFIER', ... –

0

io non sono sicuro se la variabile è sempre popolata in formato stringa o binario, ma potrebbe essere necessario citare l'uniqueidentifier nella clausola WHERE. Se selezioni semplicemente il campo uniqueidentifier, torna come stringa o binario?

+0

ho persino provato a passare l'identificatore univoco esatto con virgolette, ma sta dando una sintassi errata quando lo faccio. qualsiasi esempio su come farlo. –

+0

aspetta un minuto ... non hai bisogno di mettere il nome var fuori dalle virgolette? così lungo le linee di WHERE CreatedBy = '+ @p_CreatedBy +') Penso che in questo modo metta la stringa letterale in sql. –

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

EXEC sp_executesql @sql, @ParmDefinition, @p_CreatedBy = @p_CreatedBy 
Problemi correlati