sql - 执行动态生成的 T-Sql 函数

标签 sql sql-server-2008 t-sql dynamic-sql

这是我的示例

enter image description here

在上表中,我将评估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/

相关文章:

mysql - 如何在 select 语句中选择 count()

sql-server - 为什么我在 SQL Server 中的空间搜索比 PostGIS 慢?

sql-server - 将 .bak 文件还原到 SQL Server 2008 时出错

sql - 从另一个 sp 获取 sp 值

mysql - 使用 MAX 时,行被排除在 SQL 查询之外

sql-server - 在 SQL 表中插入新行而不分配任何值

sql-server - 选择声明以显示丢失的记录(简单问题)

sql-server - 从 T-SQL 函数返回 View 中的记录计数

PHP收件箱系统

javascript - 如何在asp.net中使用 'onKeyUp'属性?