2009-06-24 22 views
13

我有以下動態查詢工作正常,沒有WHERE子句,這是期待UNIQUEIDENTIFIERT-SQL:如何在動態SQL中使用參數?

當我通過它時,我沒有得到結果。我試過CASTCONVERT,但沒有結果。我可能做錯了,任何人都可以幫忙嗎?

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 

回答

22

您必須將參數傳遞給sp_executesql。 See MSDN for details

... 
WHERE 
    CreatedBy = @p 
... 

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

我不確定您的變量是否以字符串格式或二進制填充,但您可能需要引用where子句中的uniqueidentifier。如果你只是選擇uniqueidentifier字段,它會返回字符串還是二進制?

+0

我甚至試過用引號傳遞確切的uniqueidentifier,但是當我這樣做的時候它給出了不正確的語法。任何示例如何做到這一點。 – 2009-06-24 07:07:46

+0

等一下......你不需要把var的名字放在引號之外嗎?所以沿着WHERE CreatedBy ='+ @p_CreatedBy +'的行) 我認爲這種方式實際上把文字字符串放入sql中。 – 2009-06-24 07:15:24

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

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