-1

重複の可能性:
SQL IN 句をパラメータ化しますか?
パラメータの配列をストアド プロシージャに渡す

一意の識別子のコレクションをストアド プロシージャに渡す必要があります。やりたいことをテストするために、次のクエリを書きました。

SELECT  *
FROM    MyTable
WHERE   MyTable.TypeId IN ('852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82')

このクエリは正しく実行されます。そこで、このストアド プロシージャを作成しました。

CREATE PROCEDURE [dbo].[MySproc] (
@TypeIdsList varchar(8000)
) AS

BEGIN
EXEC(
    'SELECT *
    FROM    MyTable
    WHERE   MyTable.TypeId IN (' + @TypeIdsList + ')'
)
END

しかし、いくつかのサンプルデータで実行すると:

DECLARE @return_value int

EXEC    @return_value = [dbo].[MySproc]
        @TypeIdsList = N'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'

SELECT  'Return Value' = @return_value

GO

次のエラーが表示されます。

「D7F39」付近の構文が正しくありません。

私が間違っていることを知っている人はいますか?

4

2 に答える 2

2
<ids>
    <id value='852D7F39-302A-4E35-94D4-9A0335F8E9DC'/>
    <id value='1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'/>
</ids>

create procedure [dbo].[MySproc] (@TypeIdsList xml)
as 
begin

    declare @idoc int
    exec sp_xml_preparedocument @idoc output, @TypeIdsList
    create table #ids (id uniqueidentifier)

    insert into #ids
            select a.value
                from openxml (@idoc, '/ids/id',1)
            with (value uniqueidentifier) a

    select t.*
        from MyTable t 
            inner join #ids i with (nolock) on t.TypeId = i.id     

-- or
-- SELECT t.*
-- FROM MyTable t
-- WHERE t.TypeId IN (SELECT i.id FROM #ids WITH(NOLOCK))
end
于 2013-01-14T20:00:18.633 に答える
0

よくわかりません。最初のクエリが正しく実行されるとはどういう意味ですか? 人間 (少なくともこれ) には、 '852D7F39-302A-4E35-94D4-9A0335F8E9DC'またはの 2 つの値を探しているように見えます'1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'。ただし、SQL は式をカンマを含む1 つの値として解釈します。'852D7F39-302A-4E35-94D4-9A0335F8E9DC,1DF6EAA0-D0EC-4E4D-9E6B-1779F0E42A82'

ストアド プロシージャは、これを 2 つの値に変換したいようです。ただし、カンマに問題があります。次のようなものが必要です:

WHERE   MyTable.TypeId IN (''' + replace(@TypeIdsList, ',', '''') + ''')'

ああ、その動的 SQL は混乱を招く可能性があります。単に使用するcharindex()like、通常の SQL で使用する方が簡単かもしれません:

where charindex(','+MyTable.TypeId+',' , ','+@TypeIdsList+',') > 0

また

where ','+@TypeIdsList+',' like '%,'+MyTable.TypeId+',%'
于 2013-01-14T18:52:54.130 に答える