2013-03-14 95 views
2

我試圖做這樣的事情:是否有可能在沒有創建nvarchar變量的情況下在SQL中選擇一個選擇?

--This table has a list of columns I need from #testTableTwo 
CREATE TABLE #testTableOne 
(
    id nvarchar(250) 
) 

--This column has the values I need. I just don't know which columns I want. 
CREATE TABLE #testTableTwo 
(
    one INT, 
    two INT, 
    three INT, 
    four int 
) 



INSERT INTO #testTableOne VALUES ('one'),('two'),('three') 
INSERT INTO #testTableTwo VALUES (1,2,3,4) 
    SELECT (SELECT * FROM #testTableOne) FROM #testTableTwo 

所以我想這是是:

SELECT ONE, TWO, THREE FROM #testTableTwo 

這可能嗎?我知道我可以製作一個nvarchar,並用COALESCE做一些事情,但我試圖避免這種情況。有沒有什麼好方法可以做到這一點?

+2

我不明白你的問題。 – Kermit 2013-03-14 19:12:48

+3

你在這裏尋找什麼最終結果? – HLGEM 2013-03-14 19:13:00

+0

這是可能的(因爲它是一個select *語句),但你想要什麼結果從查詢 – Badmiral 2013-03-14 19:24:41

回答

2

您將不得不像這樣使用動態SQL。

-- First construct the fields list 
DECLARE @fields varchar(500) 
SET @fields = STUFF((SELECT ', ' + #testTableOne.id 
       FROM #testTableOne 
       FOR XML PATH(''),TYPE).value('.','VARCHAR(MAX)') 
      , 1, 2, '') 

-- Next construct the actual SQL statement 
DECLARE @sql nvarchar(max) 
SET @sql = 'SELECT '[email protected]+' FROM #testTableTwo' 

-- And last but not least run it. 
EXEC sp_executesql @sql 
+0

+1:完美的答案,但我會選擇@fields = Coalesce(@fields +',','')+ t.id從#testTableOne'作爲變量填充的路線,因爲只有'FOR XML PATH'解決方案,如果列名中有某些字符('<','>','''等),可能會遇到問題。我之前已經用FOR XML PATH解決方案解決了這個問題。大多數情況下,是完美的,在某些情況下它可以做'COALESCE'不能做的事情,但是因爲它是一個直接的變量羣體,所以它更安全。 – 2013-03-14 19:43:10

+0

好的代碼,但是OP想要做*沒有*建立一個字符串(我知道的是不可能,但也許你的答案應該是更明確的嗎?) – Blorgbeard 2013-03-14 19:45:11

+0

我也使用過這種方法,但我遇到了非常長的字符串的問題,它在幾千個字符後切斷了combind字符串。 – 2013-03-14 19:45:29