2014-01-07 36 views
1

通過使用下面的查詢,臨時表testingTemp將被創建和列的定義都取決於oriTable(我猜)可以使用SQL Server自動創建所有可空列的臨時表?

Select a.ID AS [a], 
     b.ID AS [b], 
     c.ID AS [c] 
INTO #testingTemp 
FROM 
oriTable 

我有我的第二個查詢如下:

Insert into #testingTemp (c) 
Select z.ID AS [c] 
FROM 
oriTable 

現在,當我執行第二次查詢時,SQL Server投訴

Cannot insert the value NULL into column 'a' , table 'tempdb.dbo.testingTemp...blabla 

我可否知道如何解決此問題而不更改oriTable結構?

+2

您是否嘗試過創建#testingTemp表?像CREATE TABLE #testingTemp(一個int null,b int null,c int null)? –

+0

@ Marciano.Andrade:我正在尋找替代品,因爲真正的場景是我的第一個查詢將實際選擇噸列。如果有其他選擇,我不想自己定義列。 –

+1

如果這些值包含NULL,那麼該列也是可以爲空的。因此,也許你可以在插入之前在數據中添加一個空值的聯合。 –

回答

5

使用

SELECT ID + 0 AS [a], 
     ID + 0 AS [b], 
     ID + 0 AS [c] 
INTO #testingTemp 
FROM oriTable 

通過表達式計算列的爲空幾乎總是假定NULL而非NOT NULL

+1

我相信最好使用ID +'',因爲它不會與varchar衝突。即將發佈時,當我看到你的答案 –

+0

@ t-clausen.dk - 好點。我只是假設'ID'很可能是'int'(可能在看過Marciano的評論之後),但是對於我們所知的一切,它可能是唯一標識符,表達式需要再次改變! –

+0

好想法。使用Coalesce –

0

試試這個:

ALTER TABLE #testingTemp ALTER COLUMN [a] int NULL 
0

試試這個:

期間第一次插入嘗試將具有約束(主鍵或非空)的列轉換爲它們各自的數據類型。

Select convert(int,a.ID) AS [a], 
     b.ID AS [b], 
     c.ID AS [c] 
INTO #testingTemp 
FROM 
oriTable 

由於我們使用convert函數,約束結構(主要或非空約束)不會複製到臨時表中。 ,現在你可以輕輕地觸發第二個插入語句,並且它將會執行而不會出現任何錯誤。

Insert into #testingTemp (c) 
Select z.ID AS [c] 
FROM 
oriTable 
相關問題