尝试在sql server中将'NULL'的所有字符串值更新为NULL

Kit*_*nes 3 sql sql-server

我有一个从其中包含的csv文件导入的数据库表NULL,因此当导入它而不是字段为NULL时,它们包含字符串值'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')
Run Code Online (Sandbox Code Playgroud)

但这不起作用.我收到错误消息

消息201,级别16,状态4,过程sp_fixnulls,行0
过程或函数'sp_fixnulls'需要参数'@column',它未提供.

Eli*_*ert 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
Run Code Online (Sandbox Code Playgroud)

一个小注释,我的代码将列设置为空字符串,这与NULL不同.我选择了你现有的例子.如果你想要NULL,那么

SET ' + @column + '= NULL
Run Code Online (Sandbox Code Playgroud)

  • 你需要在`@sql` 周围加上括号(即`EXEC (@sql)`)。 (2认同)
  • 这将修复存储过程中的缺陷,但不会修复错误(这是由于尝试将 select 语句作为参数传递给存储过程引起的)。 (2认同)

gmm*_*gmm 5

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

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

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

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

SELECT 'EXECUTE sp_fixnulls N''' + column_name + ''';'
        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table';
Run Code Online (Sandbox Code Playgroud)

这会产生像下面的语句(假设表中的列idnamedate)。

EXECUTE sp_fixnulls N'id';
EXECUTE sp_fixnulls N'name';
EXECUTE sp_fixnulls N'date';
Run Code Online (Sandbox Code Playgroud)

另一种选择是完全放弃存储过程。

SELECT 'UPDATE my_table SET ' + column_name
        + ' = NULL WHERE ' + column_name + ' = ''NULL'';'
        FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'my_table';
Run Code Online (Sandbox Code Playgroud)

这将生成如下语句。

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';
Run Code Online (Sandbox Code Playgroud)