2

データベースに次のようなストアド プロシージャがあります。

ALTER PROCEDURE [dbo].[GetCountingAnalysisResults] 
    @RespondentFilters varchar
AS
BEGIN

@RespondentFilters = '''8ec94bed-fed6-4627-8d45-21619331d82a, 114c61f2-8935-4755-b4e9-4a598a51cc7f'''

DECLARE @SQL nvarchar(600)

SET @SQL = 
   'SELECT *
    FROM Answer
    WHERE Answer.RespondentId IN ('+@RespondentFilters+'''))
    GROUP BY ChosenOptionId'

exec sp_executesql @SQL

END

コンパイルして実行しますが、IN ステートメントが機能していないのと同じように、どういうわけか良い結果が得られません。この問題の解決策を知っている人がいたら、助けてください。

4

5 に答える 5

3

GUID のリストをテーブルに分割し、そのテーブルに対して結合することを検討する必要があります。入力文字列をテーブルに分割するテーブル値関数の例をオンラインでたくさん見つけることができるはずです。

そうしないと、ストアド プロシージャが SQL インジェクションに対して脆弱になります。@RespondentFilters の次の値を検討してください。

@RespondentFilters = '''''); SELECT * FROM User; /*'

クエリは、パラメーター値を解析 (つまり、検証) して結合することで、より安全になります。

SELECT *
FROM Answer
WHERE Answer.RespondentId IN (SELECT [Item] FROM dbo.ParseList(@RespondentFilters))
GROUP BY ChosenOptionId

また

SELECT *
FROM Answer
INNER JOIN dbo.ParseList(@RespondentFilters) Filter ON Filter.Item = Answer.RespondentId
GROUP BY ChosenOptionId

動的 SQL を扱っていないので、少し効率的です (sp_executesql はクエリ プランをキャッシュしますが、クエリに項目の変数リストがあるため、クエリがパラメーター化されたクエリとして正確に識別されるかどうかはわかりません)。 IN句)。

于 2008-09-18T15:59:11.663 に答える
2

リスト内の各 GUID を一重引用符で囲む必要があります

@RespondentFilters = '''8ec94bed-fed6-4627-8d45-21619331d82a'', ''114c61f2-8935-4755-b4e9-4a598a51cc7f'''
于 2008-09-18T15:45:07.097 に答える
1

@RespondentFiltersの前後に閉じ引用符がないようです

'8ec94bed-fed6-4627-8d45-21619331d82a、114c61f2-8935-4755-b4e9-4a598a51cc7f'

GUIDは文字列比較を行うため、それは機能しません。

最善の策は、コードを使用してリストを複数の値に分割することです。

このようなもの:


-- This would be the input parameter of the stored procedure, if you want to do it that way, or a UDF
declare @string varchar(500)
set @string = 'ABC,DEF,GHIJK,LMNOPQRS,T,UV,WXY,Z'


declare @pos int
declare @piece varchar(500)

-- Need to tack a delimiter onto the end of the input string if one doesn't exist
if right(rtrim(@string),1)  ','
 set @string = @string  + ','

set @pos =  patindex('%,%' , @string)
while @pos  0
begin
 set @piece = left(@string, @pos - 1)

 -- You have a piece of data, so insert it, print it, do whatever you want to with it.
 print cast(@piece as varchar(500))

 set @string = stuff(@string, 1, @pos, '')
 set @pos =  patindex('%,%' , @string)
end

RaymondLewallenから盗まれたコード

于 2008-09-18T15:41:02.737 に答える
1

文字列内にも引用符が必要だと思います。試す:

@RespondentFilters = '''8ec94bed-fed6-4627-8d45-21619331d82a'',''114c61f2-8935-4755-b4e9-4a598a51cc7f'''

@RespondentFilters を一時テーブルに解析することも検討できます。

于 2008-09-18T15:44:26.177 に答える
0

あなたの答えのためにあなたのすべてをタンクに入れます。それらはすべて大いに役立ちました。分割関数を作成して問題に対処しましたが、正常に動作します。それは私ができることから少しオーバーヘッドがありますが、ご存知のように、締め切りは間近に迫っています :)

于 2008-09-20T12:37:09.160 に答える