Динамическое обновление sql - PullRequest
1 голос
/ 09 декабря 2011

Я строю динамическое обновление SQL. Этот оператор обновит неизвестное количество столбцов. Я ищу умный способ установить запятые между столбцами в операторе обновления правильно.

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET '
WHILE (somecondition)
BEGIN
    IF (someothercondition)
        SET @UpdateSQL = @UpdateSQL + @ColNameVar + ' = ' @ColNameVar + ',' --How to set this comma only on columns that are not the last??
END

Конечно, с этим updateSQL можно строить больше, но это единственная важная часть моего вопроса.

Одно важное замечание: при последнем запуске цикла while не обязательно вводить новый столбец в обновление, поэтому я не мог использовать его в качестве проверки.

Есть идеи?

Использование SQL Server-2008

Ответы [ 4 ]

0 голосов
/ 09 декабря 2011

Всегда есть почти лучший способ сделать что-либо, чем динамический SQL ... таблицы имеют конечное число столбцов, даже если обновление является динамическим. В этом случае напишите полный оператор UPDATE с условными предложениями SET:

UPDATE MYTABLE
SET Col1 = CASE WHEN ISNULL(@Col1, '') = '' THEN Col1 ELSE @Col1 END,
Col2 = CASE WHEN ISNULL(@Col2, '') = '' THEN Col1 ELSE @Col2 END,
Col3 = CASE WHEN ISNULL(@Col3, '') = '' THEN Col1 ELSE @Col3 END,
Col4 = CASE WHEN ISNULL(@Col4, '') = '' THEN Col1 ELSE @Col4 END
WHERE Blah = 'blah'

Точное условие для ваших утверждений может отличаться - вы можете заменить оператор CASE на ISNULL () или COALESCE (), чтобы упростить управление.

Это означает, что запрос будет кэширован, выполнение будет быстрее (хотя это пренебрежимо мало), но, самое главное, код будет намного легче читать и отлаживать.

0 голосов
/ 09 декабря 2011

Вы можете удалить последний символ , после цикла while, как показано ниже:

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET '
WHILE (somecondition)
BEGIN
    IF (someothercondition)
        SET @UpdateSQL = @UpdateSQL + @ColNameVar + ' = ' @ColNameVar + ','
              --How to set this comma only on columns that are not the last??
END
SET @UpdateSQL  = LEFT(@UpdateSQL , LEN(@UpdateSQL)-1) 
0 голосов
/ 09 декабря 2011

Поскольку строка может не заканчиваться запятой, попробуйте следующее:

if right(@UpdateSQL, 1) = ','
begin
    set @UpdateSQL = left(@UpdateSQL, len(@UpdateSQL) - 1)
end
0 голосов
/ 09 декабря 2011

После цикла убрать последний символ?

SET @UpdateSQL = LEFT(@UpdateSQL, LEN(@UpdateSQL) - 1)


Измените положение ',' на ПЕРЕДНЮЮ часть добавленного кода, но не устанавливайте его для первого ...

DECLARE @UpdateSQL nvarchar(max) = 'UPDATE MYTABLE SET ', @comma NVARCHAR(2) = ' '
WHILE (somecondition)
BEGIN
    IF (someothercondition)
    BEGIN
        SET @UpdateSQL = @UpdateSQL + @comma + @ColNameVar + ' = ' @ColNameVar
        SET @comma     = ', '
    END
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...