2009-06-24 2 views
13

Ich habe die folgende dynamische Abfrage, die ohne die WHERE-Klausel funktioniert, die UNIQUEIDENTIFIER erwartet.T-SQL: Wie benutzt man Parameter in dynamischem SQL?

Wenn ich es übergebe, bekomme ich kein Ergebnis. Ich versuchte CAST und CONVERT, aber kein Ergebnis. Ich könnte es falsch machen, kann jemand helfen?

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 

Antwort

22

Sie müssen die Parameter an sp_executesql übergeben. See MSDN for details.

... 
WHERE 
    CreatedBy = @p 
... 

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

Ich habe dies versucht, es funktioniert nicht, gibt mir den folgenden Fehler "Prozedur erwartet Parameter '@ Parameter' des Typs 'Ntext/Nchar/Nvarchar'." –

+3

Machen Sie die Zeichenfolge NCHAR, indem Sie ein 'N' hinzufügen: EXECUTE sp_executesql @sql, N '@ p UNIQUEIDENTIFIER', ... –

0

Ich bin nicht sicher, ob Ihre Variable im Zeichenfolgenformat oder binär gefüllt wird, aber Sie müssen möglicherweise den Uniqueidentifier in Ihrer Where-Klausel angeben. Wenn Sie nur das Feld uniqueidentifier auswählen, kommt es als String oder Binär zurück?

+0

ich versuchte sogar, die genaue uniqueidentifier mit Anführungszeichen zu übergeben, aber es gibt falsche Syntax, wenn ich dabei bin. irgendein Beispiel, wie man das macht. –

+0

Warten Sie eine Minute ... müssen Sie nicht den var Namen außerhalb der Anführungszeichen setzen? also in den Zeilen von WHERE CreatedBy = '+ @p_CreatedBy +') Ich denke, dass auf diese Weise tatsächlich die literale Zeichenfolge in die SQL platziert. –

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

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