2009-09-18 5 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

+1 sp_executesql 권장! – 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

그럼 그냥 알려주세요.