2016-04-29 9 views
-1

Ich habe ein lästiges Problem, wo ich zwei Parameter in eine gespeicherte Prozedur übergeben und sie für die Verwendung innerhalb der WHERE-Klausel meiner Aussage zusammenfügen. Der erste Parameter wird in einem equals-Ausdruck verwendet, während der zweite Parameter eine AND-Klausel bildet.gespeicherte Prozedur verketten zwei Parameter in where-Klausel

Der folgende Auszug des gespeicherten Proc, zeigt, was ich versuche zu tun.

Declare @CombinedWhereClause varchar(500), @Sender varchar(10), @AndClause char(200) 

Set @Sender = 'Wayne'; 
Set @AndClause = ' AND Convert(varchar(8), MessageDate, 112) < DATEADD(day, -10, GETDATE())'; 
Set @CombinedWhereClause = @Sender + @AndClause; 

SELECT Messages.Id, Messages.IdExternal, Messages.MessageReference, 
FROM Messages 
WHERE Messages.Sender [email protected] 

Wenn ich ersetzen die @CombinedWhereClause mit @Sender nur dann bekomme ich die erwarteten Datensätze zurück. Wenn ich die WHERE-Klausel ändere, um zu sein:

dann bekomme ich alle Datensätze, die 10 Tage alt sind. Kombiniert bekomme ich jedoch keine Ergebnisse.

+0

Bitte beachten Sie die dbms markieren. (Das ist produktspezifischer Code.) – jarlh

+1

Welches RDBMS (Hersteller und Version)? Erwarten Sie wirklich, dass die Db-Engine wissen könnte, dass die Zeichenfolge, mit der Sie vergleichen, keine Zeichenfolge, sondern eine Where-Klausel-Erweiterung ist? Dies ist nur mit dynamischem SQL möglich ... – Shnugo

+0

Ich nehme sql server wegen der 'getdate()' und 'convert()' Syntax an. Wie auch immer, ich kenne keine rdbms, die reguläre SQL und dynamische SQL kombinieren können. –

Antwort

0

In Ihrer Erklärung sind einige Mängel auf:

  • Das Komma hinter dem MessageReference
  • Sie versuchen WHERE Messages.sender=Wayne zu haben, aber Sie müssen Anführungszeichen ...='Wayne'
  • Sie denken, die DB-Engine irgendwie Magie :-) ist
  • Das ist - sicher! - man sollte nicht der Ansatz gewählt ...

Versuchen Sie diesen dynamischen Ansatz (SQL Server-Syntax)

Declare @CombinedWhereClause varchar(500), @Sender varchar(10), @AndClause char(200) 

Set @Sender = '''Wayne'''; --you need to wrap the word in quotes! 
Set @AndClause = ' AND Convert(varchar(8), MessageDate, 112) < DATEADD(day, -10, GETDATE())'; 
Set @CombinedWhereClause = @Sender + @AndClause; 

DECLARE @cmd VARCHAR(MAX)= 
'SELECT Messages.Id, Messages.IdExternal, Messages.MessageReference 
FROM Messages 
WHERE Messages.Sender =' + @CombinedWhereClause; 

--check the command 
SELECT @cmd; 

--if the command is OK you might execute it 
--EXEC(@cmd); 
+0

Danke Shnugo. Ich muss das alles jetzt in eine CTE-Funktion integrieren. –

+0

@WayneAtherton, Was willst du wirklich? Dies ist dynamisches SQL, Sie können dies nicht einfach in ein CTE * umwandeln ... Es könnte eine Lösung geben: Erstellen Sie eine physische (temp-) Tabelle und lassen Sie das dynamische SQL eine 'INSERT'-Anweisung für diese Tabelle sein. Sie können dann den Tabelleninhalt in einer "normalen" Abfrage verwenden ... – Shnugo

+0

Guter Anruf. Danke für den Hinweis –

Verwandte Themen