2013-08-19 73 views
2

這是我Sample執行動態生成的T-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'. 
+0

你的意思是要選擇動態列,這將被傳遞給你作爲參數?如果多數民衆贊成案件'exec'是正確的答案,它是爲動態sql語句。 – Nilesh

回答

0

這裏ü去了更新的查詢,這是我可以做的,由於缺乏信息的最好的事情,我相信沒有像選擇[Select * from sample]從示例中,唯一可以做到的事情就是正確地編寫動態查詢並使用sp_executesql執行它,關閉因爲您可以傳遞參數來過濾它,歡呼兄弟

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

2013年8月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年8月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 [email protected] 
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 
+0

如何獲取返回值?另外我應該可以在SQL Select語句中做到這一點 –

+0

等待,我寫了你的完整語句 –

+0

問題,你如何得到無列名稱列? xD –

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 
+0

唯一的考慮是要小心使用FOR XML PATH和轉義字符。 http://sqlblog.com/blogs/rob_farley/archive/2013/06/13/24296.aspx –

+1

好點,謝謝,更新了我的答案。 –