C# から値の LIST を渡し、ストアド プロシージャでクエリを実行しようとしています。
これは私が持っているものです:
select distinct FileStream_ID
FROM dbo.vEmailSent
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
しかし、括弧がある場合とない場合の構文でエラーが発生します。助けてください。
C# から値の LIST を渡し、ストアド プロシージャでクエリを実行しようとしています。
これは私が持っているものです:
select distinct FileStream_ID
FROM dbo.vEmailSent
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
しかし、括弧がある場合とない場合の構文でエラーが発生します。助けてください。
いくつかの構文エラーが発生する可能性があります。
まず第一に、あなたはあなたの条項and
の始めにあります。WHERE
への変更:
WHERE
RequestType_ID in ( + '"' + @RequestTypeID +'"' + )
次に、括弧+
の最初と最後にあります。IN
これは無効であり、次のように変更する必要があります。
WHERE
RequestType_ID in ('"' + @RequestTypeID + '"')
最後に、あなたは持っているべきではありません'"'
。パラメータ@RequestTypeID
が型の場合は、引用符で囲むのではなく、型int
にする必要があります。CAST()
varchar
WHERE
RequestType_ID in (CAST(@RequestTypeID as varchar(100))
これはあなたがやろうとしていることではないと思いますが、@RequestTypeID
実際にはコンマで区切られた整数です。
その場合、あなたが試みているようにこれを使うことはできません。の場合@RequestTypeID = '1,2,3'
、SQLはレコードを返しますRequestType_ID = '1,2,3'
。したがって、結果は0になります。
のAND
直後にありWHERE
ます。しかし、それを修正したとしても、関数が必要です。そうすれば、Split
これは機能します。
WHERE
([RequestType_ID] IN
(SELECT Item
FROM dbo.Split(@RequestTypeID, ',') AS Split))
これは、テーブル値関数の可能な実装です。
CREATE FUNCTION [dbo].[Split]
(
@ItemList NVARCHAR(MAX),
@delimiter CHAR(1)
)
RETURNS @IDTable TABLE (Item VARCHAR(50))
AS
BEGIN
DECLARE @tempItemList NVARCHAR(MAX)
SET @tempItemList = @ItemList
DECLARE @i INT
DECLARE @Item NVARCHAR(4000)
SET @tempItemList = REPLACE (@tempItemList, ' ', '')
SET @i = CHARINDEX(@delimiter, @tempItemList)
WHILE (LEN(@tempItemList) > 0)
BEGIN
IF @i = 0
SET @Item = @tempItemList
ELSE
SET @Item = LEFT(@tempItemList, @i - 1)
INSERT INTO @IDTable(Item) VALUES(@Item)
IF @i = 0
SET @tempItemList = ''
ELSE
SET @tempItemList = RIGHT(@tempItemList, LEN(@tempItemList) - @i)
SET @i = CHARINDEX(@delimiter, @tempItemList)
END
RETURN
END
これは機能しません。テーブル値パラメーター (SQL Server 2008 以降を使用している場合)、動的 SQL、XML を使用し、関数などを使用して文字列をテーブルに分割する必要があります。
MVP の Erland Sommarskog は、各アプローチの長所と短所について優れた内訳を示しています。パフォーマンス データは次のとおりです。