这是我的示例
表
在上表中,我将评估No Column Name
中的字段,如下所示:
--Evaluates Expression
declare @ExpressionString varchar(max)
set @ExpressionString = 'Select ' + @ExpressionString
Exec (@ExpressionString )
现在上面的内容工作正常,直到我从程序中获取输出,但是我无法执行此操作:
Select (Select [No Column Name]) from Sample
我期望的结果是:
AI
我将得到:
exec ('select Left(''AI 0400'',2)')
我怎样才能实现这个目标?
这样:
Select (EXEC SP_EXECUTESQL Value) from Sample
从示例中我收到错误:
Incorrect syntax near the keyword 'EXEC'.
最佳答案
您似乎想要计算 Sample
表中的所有表达式并将结果作为单个结果集返回。
一种方法是遍历整个表来构建此类动态查询:
SELECT Left('AI 0400',2) UNION ALL SELECT Right('0000' + 'AI 0400',4) UNION ALL ...
然后执行生成的脚本。
构建此类查询的问题本质上归结为将多行连接成单个字符串值的问题,即 often asked question在堆栈溢出上。 SQL Server 中该问题最常见的解决方案之一是使用 FOR XML
查询,以下是如何将其应用于您的情况:
DECLARE @sql nvarchar(max);
SET @sql =
STUFF(
(
SELECT 'UNION ALL SELECT ' + Value + ' '
FROM Sample
FOR XML PATH (''), TYPE
).value('.', 'nvarchar(max)'),
1, 10, '' -- these are set to remove the initial 'UNION ALL '
)
;
PRINT(@sql); -- view the (first 4K chars of the) script before running
--EXECUTE (@sql); -- uncomment if your inspection didn't reveal anything wrong
关于sql - 执行动态生成的 T-Sql 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18308326/