2017-05-16 60 views
4

請原諒我的代碼,我仍在學習。SQL Server:多個插入臨時表,同時爲每個不同的插入創建值

我想要做的是採取幾個選擇語句,並將它們插入到一個臨時表。對於每個select語句,我希望通過某種標識來知道數據來自哪個select語句。

下面我有一個粗略的想法來使用下面的case語句。

錯誤:

Msg 8152, Level 16, State 14, Line 14
String or binary data would be truncated.

代碼:

if object_id('tempdb..#PP') is not null 
    drop table #PP 

SELECT 
    #Pr.*, 
    Case 
     When TranID = TranID then 'BK Problem' 
     Else 'Error' End as 'Test' 
INTO #PP 
FROM #Pr 
WHERE TypeID = 't' 

--CCA Test 
INSERT INTO #PP 
    SELECT 
     #Pr.*, 
     Case 
      When TranID = TranID then 'CCA Problem' 
      Else 'Error' End as 'Test' 
    FROM #Pr 
    WHERE TypeID = 'r' 

我感謝指着我的方向是正確的任何幫助。

謝謝

回答

2

如果你使用SELECT.. INTO..這樣,列長度由每列的第一個插入的最大長度決定。

所以..插入「BK問題」第一,創建Test柱上用的「BK問題」的長度,或10
(這樣做以看到:PRINT LEN('BK Problem')

然後插入「CCA問題」到Test失敗,因爲它是11的長度,太長了。

我不明白你的case語句的需要或者,試試這個:

SELECT #Pr.*, CAST('BK Problem' as VARCHAR(11)) Test 
INTO #PP 
FROM #Pr 
WHERE TypeID = 't' 

--CCA Test 
INSERT INTO #PP 
SELECT #Pr.*, 'CCA Problem' 
FROM #Pr 
WHERE TypeID = 'r' 
+0

謝謝你,我用的情況,因爲我還是新來這個,這是我所能的事情,只有這樣才能得到帶有我想要的值的新列。 – Nlub

+0

@Nub NP。你非常接近,你的案例邏輯甚至不需要。快樂的編碼。 PS。寫得很好的問題,我們都明白。 –

2

問題是你的情況下表達式。當使用select into創建表時,它將創建「Test」列作爲varchar(10)。但在您的插入語句中,該值爲11個字符長。您可以通過在原始大小寫表達式上進行轉換/轉換來避免這種情況,以使列足夠寬。

SELECT #Pr.*, 
     convert(varchar(20), Case 
     When TranID = TranID then 'BK Problem' 
     Else 'Error' End) as 'Test' 
INTO #PP 
FROM #Pr 
WHERE TypeID = 't'