2013-01-24 37 views
2

我有一個從它有NULL CSV文件導入數據庫表,這樣,當它被導入的字段是空的,而不是它們所包含的字符串值'NULL'試圖「NULL」的所有字符串值更新爲NULL在SQL Server

CSV文件要在文本編輯器中打開才能編輯出所有NULL,所以我試圖創建一個SQL查詢來更新表的每一列。

到目前爲止,我有這個

Alter PROCEDURE [dbo].[sp_fixnulls] 
    @column nvarchar(100) 
AS 
BEGIN 
    SET NOCOUNT ON; 
    UPDATE my_table 
    SET @column='' 
    WHERE @column = 'NULL' 
END 

--------------- 

sp_fixnulls (SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME ='my_table') 

,但是這是行不通的。我得到的錯誤消息

消息201,級別16,狀態4,過程sp_fixnulls,行0
過程或函數 'sp_fixnulls' 預計參數 '@column',但未提供。

+0

「但這是行不通的。「你能更具描述性嗎?錯誤信息?意外的結果?結果是什麼?」不起作用「不是結果 –

+1

我不認爲你可以傳遞一個對象名作爲參數直接由SQL執行。也許你可以在SQL中構建查詢字符串,然後使用EXEC。另外,避免調用你自己的sprocs名稱,前綴爲'sp_'[因爲這個](http://sqlserverpedia.com/blog/sql-server-bloggers/stored -procedure-performance-using-%E2%80%9Csp_%E2%80%9D-prefix-%E2%80%93-myth-or-fact /) – Matt

+0

如何導入csv到數據庫? –

回答

7

@column是一個變量。它不能動態地將其內容換成SQL。您需要使用TSQL來完成這一任務,從而將SQL生成爲字符串,然後執行它。如:

DECLARE @sql VARCHAR(MAX) 
SET @sql = ' 
UPDATE my_table 
SET ' + @column + '='''' 
WHERE ' + @column + ' = ''NULL'' 
' 

EXEC (@sql) -- don't forget the parentheses 

一張小紙條,我的代碼將列空字符串,這是不一樣的NULL。我用你現有的例子去了。如果你想爲NULL,則

SET ' + @column + '= NULL 
+1

「@ sql」(即'EXEC(@sql)')需要括號。 – gmm

+1

這將修復存儲過程中的缺陷,但它不會修復錯誤(這是由於嘗試將select語句作爲參數傳遞給存儲過程而導致的)。 – gmm

+0

+1 gmm。我同意我錯過了這一點。我專注於棘手的問題,並錯過了其餘的 –

4

'消息201,級別16,狀態4,過程sp_fixnulls,行0過程或函數 'sp_fixnulls' 需要參數 '@column',但未提供。'

你得到的錯誤是因爲你試圖將select語句作爲參數傳遞給存儲過程。如果您只是將一列的名稱傳遞給存儲過程,則會發生該錯誤。

然後,你就不會收到其他錯誤,但你不會得到你想要的結果。如果您按照Eli的建議修正了存儲過程(在EXEC聲明中附加了圍繞@sql的括號,正如我所評論的那樣),它將起作用。

然後,你需要包裝用遊標存儲過程(其中大多數人不推薦,但在需要時有效)。或者,您可以選擇所有列名稱並生成一堆執行語句,然後運行語句。

SELECT 'EXECUTE sp_fixnulls N''' + column_name + ''';' 
     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table'; 

這將產生象下面的語句(假設表具有列idname,和date)。

EXECUTE sp_fixnulls N'id'; 
EXECUTE sp_fixnulls N'name'; 
EXECUTE sp_fixnulls N'date'; 

另一種選擇是完全放棄存儲過程。

SELECT 'UPDATE my_table SET ' + column_name 
     + ' = NULL WHERE ' + column_name + ' = ''NULL'';' 
     FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table'; 

這將生成如下所示的語句。

UPDATE my_table SET id = NULL WHERE id = 'NULL'; 
UPDATE my_table SET name = NULL WHERE name = 'NULL'; 
UPDATE my_table SET date = NULL WHERE date = 'NULL'; 
相關問題