2017-05-16 33 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'