2009-09-18 29 views
0

は、これが私のクエリです...しかし、それはあなたがそのようなwhere句の残りの部分に@kriter連結することはできません。動的SQLクエリ

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 

答えて

2

ダイナミックSQLを正しく使用していないため、クエリをvarchar/nvarchar変数に連結して実行する必要があります。

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 

は、SQLインジェクションを防ぐのに役立ちますように私はexampledてきたこのアプローチは、単なる文字列に直接@MyParamを連結するよりも好まれ、動的SQLには注意してください。あなたのケースでは

、あなたが実際にあなたが行うことができ、動的SQLを使用する必要はありません。

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 
+0

sp_executesqlを推奨するための+1! – Brannon

0

「+」の近くに不正な構文を返します - それはとしてそれを評価しています文字列であり、SQLではありません。文字列変数にすべてを入れてからExecを使用する必要があります。

0

これは動作するはずです:

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) 
0

私は、単一の文字を入力する前に提案することができます動的SQLを使用して、次の「必須読取り」を理解してください。

The Curse and Blessings of Dynamic SQL

あなたが内容についてのご質問がある場合は、ちょうど私に知らせてください。