2

这是我的Sample桌子

在此处输入图像描述

在上表中,我将评估这样的字段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'.
4

2 回答 2

2

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

一种方法是遍历整个表来构建这种动态查询:

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

然后执行生成的脚本。

构建此类查询的问题本质上归结为将多行连接成单个字符串值的问题,这是Stack Overflow 上经常被问到的问题。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
于 2013-08-19T13:23:29.000 回答
0

在这里你去更新查询,由于缺乏信息,这是我能做的最好的事情,我相信没有像 Select [Select * from sample] From sample 这样的东西,你唯一能做的就是写你的动态查询正确并使用 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
于 2013-08-19T07:22:56.883 回答