使用字符串变量执行select语句的结果集

问题描述 投票:0回答:1

我想在 Microsoft SQL Server 中执行动态 sql select 查询的结果。 我希望将返回多个结果的 SQL SELECT 查询的输出(语句内带有 INSERT 命令的多个 IF ELSE 语句)分配给单个字符串变量,以便我可以使用 EXEC 命令执行该变量。

它看起来像这样:

查询“SQL1”:

/* Query to generate IF statements to find duplicate and unique Policies */ 
`select 'IF EXISTS (SELECT * FROM [POLICY_TB] WHERE Policy_number = '
       +LTRIM(STR(Policy_number))
       +' BEGIN INSERT INTO @TempDuplicateClient SELECT [Client_identifier]FROM POLICY_TB WHERE [Policy_number] = '
       +LTRIM(STR(Policy_number))
       +' END'
       +' ELSE BEGIN INSERT INTO @TempUniqueClient SELECT [Client_identifier] FROM POLICY_TB WHERE [Policy_number] = '
       +LTRIM(STR(Policy_number))
       +' END '
       from POLICY_TB`

输出:

IF EXISTS (SELECT * FROM [POLICY_TB] WHERE Policy_number = 1234) BEGIN INSERT INTO @TempDuplicateClient SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = 1234 END ELSE BEGIN INSERT INTO @TempUniqueClient SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = 1234 END 
IF EXISTS (SELECT * FROM [POLICY_TB] WHERE Policy_number = 5678) BEGIN INSERT INTO @TempDuplicateClient SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = 5678 END ELSE BEGIN INSERT INTO @TempUniqueClient SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = 5678 END

我想将整个输出分配给一个字符串变量。

DECLARE @SQL2 as varchar(MAX)
SET @SQL2 = '--above output---'
or SET @SQL2 = Output of EXEC(SQL1)
EXEC(@SQL2)

简单来说,我看起来像

EXEC(EXEC(SQL))

我尝试在选择查询中使用

xml path ('')
将输出作为单个值获取,但我无法将其分配给变量,因为
EXEC('query')
不返回查询结果。

sql sql-server dynamic-sql
1个回答
0
投票

首先,您的 SQL 查询可能存在 SQL 注入漏洞。 SQL 注入是一种攻击,恶意用户会找到一种方法将 SQL 脚本“注入”到您的查询中并执行它,从而损害您的数据。 SQL 注入攻击在动态查询中很常见,开发人员连接用户输入以动态构建查询并执行它们。为了避免 SQL 注入攻击,您可以使用参数。

现在,如果您使用参数,则在您的情况下根本不需要动态查询。以下是我使用参数编写查询的方式:

IF EXISTS (SELECT 1 FROM [POLICY_TB] WHERE Policy_number = @Policy_Number)
BEGIN 
    INSERT INTO @TempDuplicateClient 
    SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = @Policy_Number
END 
ELSE 
BEGIN 
    INSERT INTO @TempUniqueClient 
    SELECT [Client_id] FROM POLICY_TB WHERE [Policy_number] = @Policy_Number
END 

请注意,上面的查询不是动态的。这是一个常规查询。但是,如果您确实需要执行动态查询,我建议使用带参数的 sp_executesql 存储过程。首先,参数可以防止SQL注入攻击。其次,带有参数的 sp_executesql 存储预处理程序将通过缓存执行计划来提高性能。

© www.soinside.com 2019 - 2024. All rights reserved.