执行动态生成的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