我有一个从其中包含的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',它未提供.
@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)
“消息 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';
Run Code Online (Sandbox Code Playgroud)
这会产生像下面的语句(假设表中的列id,name和date)。
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)
| 归档时间: |
|
| 查看次数: |
8813 次 |
| 最近记录: |