2016-05-27 1 views
-1

У меня есть триггер Microsoft SQL Server, который обновляет удаленную базу данных новыми значениями при обновлении локальной базы данных. Все работает нормально, и я тестировал скрипт, и он обновляется отлично, если нет нулевого значения.Открытый SQL-запрос T-SQL не обновляется по значению NULL

код ниже:

DECLARE @TSQL nvarchar(4000); 
SELECT @TSQL = 
    'UPDATE 
     OPENQUERY(TEST,''SELECT * FROM test_db WHERE id = ' + convert(VARCHAR(MAX), @id) +''') 
    SET 
     parent_id = ' + convert(VARCHAR(MAX), @parent_id) + ', user_id = ' + convert(VARCHAR(MAX), @user_id) + ', item_id = ' + convert(VARCHAR(MAX), @item_id) + '' 
EXEC (@TSQL) 

Все работает хорошо, если все поля имеют значения, но если один столбец имеет нулевое значение, то запрос не обновляет строку вообще, никаких ошибок не брошенную. Я попытался использовать COALESCE(), чтобы изменить нулевые переменные на пустые строки, и затем обновит строку, но все нулевые столбцы станут 0, и я хочу, чтобы они оставались как NULL значений. Все столбцы в обеих базе данных допускают нулевые значения и по умолчанию имеют значение null, поэтому я не уверен, почему я не могу обновить базу данных.

Любая помощь будет приятной, спасибо!

+0

Почему это было связано с MySQL? – tadman

+0

Забыл упомянуть, что я использовал openquery для взаимодействия с базой MySql –

+0

Вы подключаетесь к MySQL * через * SQL Server? Это звучит как рецепт неприятностей. Значения «NULL» не являются строками. Им нужно избегать иначе. – tadman

ответ

1

Попробуйте это. Используйте ISNULL, и если значение равно null, используйте «NULL» в одинарных кавычках. Когда строка конкатенируется вместе, она не будет сохранять кавычки, поэтому она установит значение NULL, а не строку «NULL».

DECLARE @TSQL nvarchar(4000); 
SELECT @TSQL = 
    'UPDATE 
     OPENQUERY(TEST,''SELECT * FROM test_db WHERE id = ' + convert(VARCHAR(MAX), @id) +''') 
    SET 
     parent_id = ' + ISNULL(convert(VARCHAR(MAX), @parent_id), 'NULL') + ', 
     user_id = ' + ISNULL(convert(VARCHAR(MAX), @user_id), 'NULL') + ', 
     item_id = ' + ISNULL(convert(VARCHAR(MAX), @item_id), 'NULL') + '' 
EXEC (@TSQL) 
+0

. Пожалуйста, объясните. Я сделал тест, используя целое поле (например, parent_id, я предполагаю), используя в основном тот же синтаксис, с переменной VARCHAR, переданной в EXEC, и она сработала. Возможно, я что-то пропускаю. – TLaV

+0

Ваша идея работала отлично, я просто использовал 'COALESCE', чтобы строка была пустой, но я просто никогда не помещал строки' NULL' внутри, поэтому использование 'COALESCE (@var, 'NULL')' заставило все работать , спасибо –

+0

@TimLaVenice Извините, мой плохой, я смутился с предложением WHERE' – Arulkumar