4

我有一个从其中包含的 csv 文件导入的数据库表NULL,因此当它被导入而不是字段为 NULL 时,它们包含字符串 value 'NULL'

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”。

4

2 回答 2

8

@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
于 2013-01-24T21:52:52.227 回答
5

“消息 201,级别 16,状态 4,过程 sp_fixnulls,第 0 行过程或函数“sp_fixnulls”需要参数“@column”,但未提供。

您收到的错误是因为您试图将 select 语句作为参数传递给存储过程。如果您只将一列的名称传递给存储过程,您将克服该错误。

然后你不会得到另一个错误,但你不会得到你想要的结果。如果您按照 Eli 的建议修复您的存储过程(正如我评论的那样@sql,在EXEC语句中添加括号),它将起作用。

然后你需要用游标包装你的存储过程(大多数人不推荐,但在需要时可以使用)。或者,您可以只选择所有列名并生成一堆执行语句,然后运行这些语句。

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

这将生成如下语句(假设表具有列idnamedate)。

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';
于 2013-01-24T22:56:40.590 回答