как выполнить запрос каждой ячейки в базе данных - PullRequest
0 голосов
/ 02 декабря 2011

Мне нужно заменить пробел на NULL в каждой ячейке в моей базе данных. SQL server 2008 r2. Я ищу что-то эффективное, но похоже, что курсор это единственный способ?

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

Сначала найдите все таблицы и столбцы, которые могут иметь значение Nullable и имеют тип CHAR или VARCHAR, используя INFORMATION_SCHEMA:

SELECT TABLE_NAME, COLUMN_NAME 
FROM  MyDatabase.INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'dbo'
  AND IS_NULLABLE = 'YES'
1 голос
/ 03 декабря 2011

Курсоры НИКОГДА не отвечают:)

ypercube сделал сложную часть. Вам нужно взять эту информацию и выполнить ее, выполняя оператор обновления для каждого столбца в каждой таблице. Вы можете сделать это с помощью оператора WHILE. Вот НЕПРОВЕРЕННЫЙ пример того, как вы могли бы сделать это:

--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 голосов
/ 02 декабря 2011

Я думаю, это зависит от того, как вы определяете пробелы. Будет ли работать следующая?

update mytable set mycolumn = null where len(rtrim(ltrim(mycolumn))) = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...