我想在 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 注入漏洞。 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 存储预处理程序将通过缓存执行计划来提高性能。