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

时间:2013-08-19 07:17:50

标签: sql sql-server-2008 tsql dynamic-sql

这是我的Sample

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

2 个答案:

答案 0 :(得分:2)

您似乎想要评估Sample表中的所有表达式,并将结果作为单个结果集返回。

这样做的一种方法是遍历整个表以构建这种动态查询:

SELECT Left('AI 0400',2) UNION ALL SELECT Right('0000' + 'AI 0400',4) UNION ALL ...

然后执行生成的脚本。

构建这种查询的问题基本上归结为将多行连接成单个字符串值的问题,这是Stack Overflow上的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

答案 1 :(得分:0)

这里你去更新查询,这是我可以做的最好的事情,因为缺乏信息,我相信没有像选择[选择*从样本]从样本,你可以做的唯一的事情写,你的动态查询正确并使用sp_executesql执行它,因为你可以传递你的参数来过滤它,欢呼兄弟

declare @ExpressionString nvarchar(max)
set @ExpressionString = 'Select [No Column Name] From Sample' 
EXECUTE sp_executesql @ExpressionString 

2013-08-20 0930AM下面是更新查询,试试吧=)

Declare @t1 TABLE
(
NAME NVARCHAR(MAX)
)

INSERT INTO @t1 VALUES ('Left(''AI 0400'',2)')


DECLARE @query NVARCHAR(MAX)

SET @query = 'Select ' + (SELECT NAME from @t1)


EXECUTE sp_executesql @query

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