gpt4 book ai didi

sql-server - 将形式为 "GUID1, GUID2, GUID3 ..."的字符串插入到 SQL 中的 IN 语句中

转载 作者:行者123 更新时间:2023-12-02 07:57:18 25 4
gpt4 key购买 nike

我的数据库中有一个存储过程,看起来像这样

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 语句不起作用一样。请,如果有人知道这个问题的解决方案,请帮助我。

最佳答案

您绝对应该考虑将 GUID 列表拆分为一个表并根据该表进行联接。对于将输入字符串拆分为表的表值函数,您应该能够在线找到大量示例。

否则,您的存储过程容易受到 SQL 注入(inject)攻击。考虑@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 子句中有一个可变的项目列表)。

关于sql-server - 将形式为 "GUID1, GUID2, GUID3 ..."的字符串插入到 SQL 中的 IN 语句中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/93653/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com