2013-01-24 38 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'; 
相关问题