2009-06-24 16 views
13

を予期しているWHERE句がなくても正常に動作している次の動的クエリがあります。T-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

私はこれを試して、それは私にfollowigのエラーを与える働いていない "プロシージャは、 'ntext/nchar/nvarchar'タイプのパラメータ '@parameters'を期待しています。 –

+3

'N'を追加して文字列NCHARを作成します。EXECUTE sp_executesql @sql、N '@ p UNIQUEIDTITIER'、... –

0

は私はわからないんだけど、あなたはあなたのwhere句でUNIQUEIDENTIFIERを引用する必要があるかもしれません。 uniqueidentifierフィールドを選択しただけの場合は、文字列またはバイナリとして返されますか?

+0

私は引用符付きの正確なuniqueidentifierを渡すことさえしようとしましたが、そうしたときに誤った構文を与えています。どのようにこれを行うにはどのような例。 –

+0

分を待つ...あなたは引用符の外にvar名を入れる必要はありませんか?だからどこの行に沿ってCreatedBy = '+ @p_CreatedBy +') 私はその方法は実際にSQLにリテラル文字列を置きますと思う。 –

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

EXEC sp_executesql @sql, @ParmDefinition, @p_CreatedBy = @p_CreatedBy 
関連する問題