Dynamische SQL-Abfrage

Dies ist meine Abfrage … aber es gibt falsche Syntax in der Nähe von '+'

DECLARE @refKlinik_id INT SET @refKlinik_id = 24 DECLARE @kriter VARCHAR(50) IF @refKlinik_id <=0 BEGIN SET @kriter = '' END ELSE SET @Kriter = 'AND H.refKlinik_id =' + @refKlinik_id SELECT H.adi + ' ' + H.soyadi AS Hasta, H.tcKimlikNo, CONVERT(varchar, H.dogumTarihi, 103) AS DogumTarihi, K.kisaAdi AS Klinik, A.acikAdres + A.ilce + A.il AS Adres, A.tel1, A.gsm, CASE H.hastaKartiVar WHEN 1 THEN 'Hasta Kartı Sahibi' WHEN 0 THEN 'Hasta Kartı Yok' WHEN NULL THEN 'Hasta Kartı Yok' END AS HastaKartiDurumu FROM Hastalar AS H INNER JOIN Klinikler AS K ON K.klinik_id = H.refKlinik_id INNER JOIN Adresler AS A ON A.refHasta_id = H.hasta_id WHERE (K.refKlinikGrup_id = 1) AND (H.durumu = 1) + @kriter + AND (A.aktif = 1) ORDER BY H.adi 

   

Sie verwenden keine dynamische SQL korrekt – Sie müssen die Abfrage in eine Variable varchar / nvarchar verknüpfen und dann ausführen.

z.B

 DECLARE @MyParam INTEGER SET @MyParam = 1 DECLARE @nSQL NVARCHAR(1000) SET @nSQL = 'SELECT * FROM SomeTable WHERE SomeField = @MyParam' EXECUTE sp_executesql @nSQL, N'@MyParam INTEGER', @MyParam 

Seien Sie vorsichtig mit dynamischen sql, dieser Ansatz, den ich exampled ist bevorzugt über nur Verkettung der @MyParam direkt auf die characterfolge, wie es hilft Schutz vor SQL-Injektion.

In deinem Fall musst du eigentlich kein dynamisches SQL verwenden, das kannst du machen:

 DECLARE @refKlinik_id INT SET @refKlinik_id = 24 SELECT H.adi + ' ' + H.soyadi AS Hasta, H.tcKimlikNo, CONVERT(varchar, H.dogumTarihi, 103) AS DogumTarihi, K.kisaAdi AS Klinik, A.acikAdres + A.ilce + A.il AS Adres, A.tel1, A.gsm, CASE H.hastaKartiVar WHEN 1 THEN 'Hasta Kartı Sahibi' WHEN 0 THEN 'Hasta Kartı Yok' WHEN NULL THEN 'Hasta Kartı Yok' END AS HastaKartiDurumu FROM Hastalar AS H INNER JOIN Klinikler AS K ON K.klinik_id = H.refKlinik_id INNER JOIN Adresler AS A ON A.refHasta_id = H.hasta_id WHERE (K.refKlinikGrup_id = 1) AND (H.durumu = 1) AND (@refKlinik_id<=0 OR H.refKlinik_id = @refKlinik_id) AND (A.aktif = 1) ORDER BY H.adi 

Du kannst @kriter nicht in den Rest der Wo Klausel so verketten – es ist die Auswertung es als String, nicht ein Stück SQL. Du musst das Ganze in eine String-Variable setzen und dann Exec verwenden

Das sollte funktionieren:

  DECLARE @refKlinik_id INT declare @query varchar(1000) SET @refKlinik_id = 24 DECLARE @kriter VARCHAR(50) IF @refKlinik_id <=0 BEGIN SET @kriter = '' END ELSE SET @Kriter = 'AND H.refKlinik_id =' + cast(@refKlinik_id as varchar(10)) set @query='SELECT H.adi + '' '' + H.soyadi AS Hasta, H.tcKimlikNo, CONVERT(varchar, H.dogumTarihi, 103) AS DogumTarihi, K.kisaAdi AS Klinik, A.acikAdres + A.ilce + A.il AS Adres, A.tel1, A.gsm, CASE H.hastaKartiVar WHEN 1 THEN ''Hasta Kartı Sahibi'' WHEN 0 THEN ''Hasta Kartı Yok'' WHEN NULL THEN ''Hasta Kartı Yok'' END AS HastaKartiDurumu FROM Hastalar AS H INNER JOIN Klinikler AS K ON K.klinik_id = H.refKlinik_id INNER JOIN Adresler AS A ON A.refHasta_id = H.hasta_id WHERE (K.refKlinikGrup_id = 1) AND (H.durumu = 1)' + @kriter + 'AND (A.aktif = 1) ORDER BY H.adi' exec(@query) 

Darf ich vorschlagen, ein einziges character von Dynamic SQL zu schreiben, das du dich mit dem "wesentlichen Lesen" vertraut machst.

Der Fluch und Segen von Dynamic SQL

Dann, wenn Sie irgendwelche Fragen über den Inhalt haben, lassen Sie mich einfach wissen.