Sql server 插入一个字符串,格式为“;GUID1、GUID2、GUID3……”;转换为TSQL中的IN语句

Sql server 插入一个字符串,格式为“;GUID1、GUID2、GUID3……”;转换为TSQL中的IN语句,sql-server,tsql,stored-procedures,guid,Sql Server,Tsql,Stored Procedures,Guid,我的数据库中有一个存储过程,看起来像这样 ALTER PROCEDURE [dbo].[GetCountingAnalysisResults] @RespondentFilters varchar AS BEGIN @RespondentFilters = '''8ec94bed-fed6-4627-8d45-21619331d82a, 114c61f2-8935-4755-b4e9-4a598a51cc7f''' DECLARE @SQL nvarchar(600) SET @

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

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

您的@respondentfilter似乎没有结束语 '8ec94bed-fed6-4627-8d45-21619331d82a, 114c61f2-8935-4755-b4e9-4a598a51cc7f'

中窃取的代码我认为字符串中也需要引号。尝试:

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

您还可以考虑将@响应过滤器解析成临时表。

在列表

中的每个GUID周围都需要单引号。 '8ec94bed-fed6-4627-8d45-21619331d82a, 114c61f2-8935-4755-b4e9-4a598a51cc7f'
@RespondentFilters = '''8ec94bed-fed6-4627-8d45-21619331d82a'', ''114c61f2-8935-4755-b4e9-4a598a51cc7f'''

您肯定应该考虑将guid列表拆分成一个表,并针对该表进行连接。对于将输入字符串拆分为表的表值函数,您应该能够在网上找到大量的示例

否则,存储过程容易受到SQL注入的攻击。考虑下面的值:@响应过滤器:

'8ec94bed-fed6-4627-8d45-21619331d82a, 114c61f2-8935-4755-b4e9-4a598a51cc7f'
@RespondentFilters = '''''); SELECT * FROM User; /*'
您的查询在解析(即验证)参数值和连接时会更安全:

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


由于您没有处理动态SQL(sp_executesql将缓存查询计划,但我不确定它是否能准确地将您的查询标识为参数化查询,因为它在in子句中有一个可变的项目列表)。

请大家回答。他们都帮了大忙。我通过编写一个分割函数来解决这个问题,它工作得很好。这与我本可以做的事情相比有一点开销,但是你知道,截止日期就在眼前:)

另外,你可以使用print@SQL来查看SQL语句在执行时的样子。你可能会在那里找到一些东西。