2016-05-27 13 views
-1

Ich habe einen Microsoft SQL Server-Trigger, der eine entfernte Datenbank mit neuen Werten aktualisiert, wenn die lokale Datenbank aktualisiert wird. Alles funktioniert gut, und ich habe das Skript getestet und es aktualisiert sich gut, es sei denn, es gibt einen Nullwert.T-SQL-Openquery wird nicht mit NULL aktualisiert

Der Code ist unten:

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) 

Alles funktioniert gut, wenn alle Felder Werte haben, aber wenn eine Spalte null ist, dann wird die Abfrage nicht die Zeile überhaupt aktualisieren, geworfen keine Fehler. Ich habe versucht, COALESCE() zu verwenden, um die Nullvariablen zu leeren Zeichenfolgen zu ändern, und es wird dann die Zeile aktualisieren, aber alle Nullspalten werden 0 und ich möchte, dass sie als NULL Werte bleiben. Alle Spalten in beiden Datenbanken lassen Nullwerte zu, und der Standardwert ist null, weshalb ich nicht sicher bin, warum ich die Datenbank nicht aktualisieren kann.

Jede Hilfe wäre nett, danke!

+0

Warum wurde dieses Tag mit MySQL markiert? – tadman

+0

Vergessen zu erwähnen, dass ich openquery zur Interaktion mit einer MySql-Datenbank verwendet habe –

+0

Sie stellen eine Verbindung zu MySQL * über * SQL Server her? Das klingt nach einem Rezept für Ärger. 'NULL' Werte sind keine Zeichenketten. Sie müssen anders entflohen sein. – tadman

Antwort

1

Versuchen Sie dies. Verwenden Sie ISNULL, und wenn der Wert null ist, verwenden Sie 'NULL' in einfachen Anführungszeichen. Wenn die Zeichenfolge verkettet wird, werden die Anführungszeichen nicht beibehalten, sodass sie auf einen NULL-Wert und nicht auf eine Zeichenfolge von "NULL" festgelegt wird.

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

Bitte erläutern. Ich habe einen Test mit einem ganzzahligen Feld (wie parent_id ist, nehme ich an), im Grunde genommen die gleiche Syntax, mit einer VARCHAR-Variable an EXEC übergeben und es hat funktioniert. Vielleicht übersehe ich etwas. – TLaV

+0

Ihre Idee hat perfekt funktioniert, ich habe nur 'COALESCE' verwendet, um die Zeichenkette leer zu machen, aber ich habe einfach nie die' NULL' in Zeichenketten gesetzt, also hat 'COALESCE (@var,'NULL ') alles funktioniert , danke –

+0

@TimLaVenice Sorry meine schlechte, ich verwechselte mit der 'WHERE' Klausel – Arulkumar