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

执行动态生成的T-Sql函数,sql,sql-server-2008,tsql,dynamic-sql,Sql,Sql Server 2008,Tsql,Dynamic Sql,这是我的示例表 在上表中,我将评估无列名中的字段,如下所示: --Evaluates Expression declare @ExpressionString varchar(max) set @ExpressionString = 'Select ' + @ExpressionString Exec (@ExpressionString ) 现在,在我从一个过程中获得输出之前,上面的工作正常,但是我无法做到这一点: Select (Select [No Column Name]) fr

这是我的
示例

在上表中,我将评估
无列名中的字段,如下所示:

--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'.

这里是更新的查询,由于缺少信息,这是我能做的最好的事情,我相信没有像从样本中选择[Select*from sample]这样的事情,你唯一能做的就是正确编写动态查询并使用sp_executesql执行它,因为你也可以传递参数对其进行过滤,啦啦队兄弟

declare @ExpressionString nvarchar(max)
set @ExpressionString = 'Select [No Column Name] From Sample' 
EXECUTE sp_executesql @ExpressionString 
2013-08-20 0930AM以下是更新的查询,请尝试它=)

2013-08-20 0950AM这里是另一个针对多个列值的更新查询

Declare @t1 TABLE
(
NAME NVARCHAR(MAX)
)

INSERT INTO @t1 VALUES ('Left(''AI 0400'',2)')
INSERT INTO @t1 VALUES ('Left(''AI 0400'',2)')
INSERT INTO @t1 VALUES ('Right(''0000'' + ''AI 0400'',4)')


DECLARE @query NVARCHAR(MAX)
DECLARE @nTotalRec INT

SET @nTotalRec =(SELECT COUNT(NAME) FrOM @t1) +1

DECLARE @nCount INT
SET @nCount = 1
DECLARE @Condition NVARCHAR(MAX)
SET @Condition = ''
WHILE @nCount !=@nTotalRec
BEGIN

SET @Condition = @Condition + (
SELECT NAME FROM (
SELECT NAME,Rn = ROW_NUMBER() OVER (ORDeR BY NAME) FROM @t1) q 
WHERE Rn = @nCount) + ','
SET @nCount = @nCount +1
END

SET @Condition = LEFT(@Condition,LEN(@Condition)-1)

SET @query = 'Select ' + @Condition


EXECUTE sp_executesql @query

您似乎希望计算
示例
表中的所有表达式,并将结果作为单个结果集返回

一种方法是遍历整个表以构建此类动态查询:

SELECT Left('AI 0400',2) UNION ALL SELECT Right('0000' + 'AI 0400',4) UNION ALL ...
然后执行生成的脚本

构建这类查询的问题本质上归结为将多行连接成单个字符串值的问题,这是堆栈溢出。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

您的意思是要选择将作为参数传递给您的动态列吗?如果是这样的话,
exec
是正确的答案,那么它是针对动态sql语句的。如何获取返回值?另外,我应该能够在SQL Select语句中执行此操作。等等,我为uQuestion编写完整的语句,如何获得no column name列?唯一需要考虑的是小心使用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