2011-12-01 75 views
0

我需要在数据库中的每个单元格中用NULL替换空格。 SQL Server 2008 R2。我正在寻找高效的东西,但看起来像光标只是方式?如何在数据库中执行查询foreach单元格

+0

数据库服务器中每个数据库的每个表的每个(char)列的每一行? –

+0

@ypercube只有一个数据库 – user194076

+1

您必须使用'INFORMATION_SCHEMA'和动态SQL。 –

回答

1

光标从不答案:)

ypercube做了最困难的部分。您需要获取该信息并遍历它,为每个表中的每列执行更新语句。你可以用WHILE语句来做到这一点。下面是你如何做到这一点的UNTESTED示例:

--Set database to use 
USE [MyDatabase]; 
GO 

--Create table variable to hold table/column pairs 
DECLARE @table TABLE (
    [Key] BIGINT PRIMARY KEY IDENTITY (1, 1), 
    [TABLE_NAME] VARCHAR(100), 
    [COLUMN_NAME] VARCHAR(100) 
); 

--Populate table variable 
INSERT INTO @table ([TABLE_NAME], [COLUMN_NAME]) 
SELECT [TABLE_NAME], [COLUMN_NAME] 
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE [TABLE_SCHEMA] = 'dbo' 
AND [IS_NULLABLE] = 'YES'; 

--Initialize counting variables 
DECLARE @counter BIGINT = 1; 
DECLARE @max BIGINT = (SELECT COUNT(1) FROM @table); 

--Iterate through each pair 
WHILE @counter <= @max 
BEGIN 
    --Assign the current pair values to variables 
    DECLARE @TableName VARCHAR(100), @ColumnName VARCHAR(100); 
    SELECT @TableName = [TABLE_NAME], @ColumnName = [COLUMN_NAME] 
    FROM @table 
    WHERE [Key] = @counter; 

    --Execute dynamic SQL 
    EXEC 
    (
     'UPDATE [' + @TableName + ']' + 
     'SET [' + @ColumnName + '] = NULL' + 
     'WHERE RTRIM([' + @ColumnName + ']) = '''';' 
    ); 

    --Increment the counter 
    SET @counter = @counter + 1; 
END 
+0

太好笑了。我没有检查过SO,并在1小时前写下了相同的脚本。谢谢@ypercube – user194076

+0

没问题!乐意效劳 :) – JOpuckman

0

我想这取决于你如何定义空白。以下的工作?

update mytable set mycolumn = null where len(rtrim(ltrim(mycolumn))) = 0 
+0

我需要一个查询来完成它在每个单元格和每个表中。不只是一列 – user194076

2

首先发现,可为空和CHAR型或VARCHAR的所有表和列,使用INFORMATION_SCHEMA:

SELECT TABLE_NAME, COLUMN_NAME 
FROM MyDatabase.INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_SCHEMA = 'dbo' 
    AND IS_NULLABLE = 'YES' 
相关问题