2015-11-06 110 views
0

我有這樣SQL Server存儲過程聲明變量

ALTER PROCEDURE [dbo].[GETMONITORING] 
    @namabarang varchar (max) 

    SET NOCOUNT ON; 

    DECLARE @nWhere varchar(4000) 
    SET @nwhere = ' where namabarang=''[email protected]+''' 

    SELECT 
     tanggalpermohonan, k.namaunitkerja, l.namajenislayanan, 
     namabarang, kodebarang, nup, r.namaruangan, p.lokasi, masalah 
    FROM 
     permohonan p 
    JOIN 
     UnitKerja k on k.idUnitKerja = p.idUnitKerja 
    JOIN 
     JenisLayanan l on l.idJenisLayanan = p.JenisLayananID 
    JOIN 
     MasterRuangan r on r.KodeRuang = p.KodeRuang 

    PRINT @nwhere 
end 

存儲過程使用我「交流」作爲參數@namabarang exec的存儲過程,它導致所有行。如果我運行在這樣的查詢

select 
    tanggalpermohonan, k.namaunitkerja, l.namajenislayanan, 
    namabarang, kodebarang, nup, r.namaruangan, p.lokasi, masalah 
from 
    permohonan p 
join 
    UnitKerja k on k.idUnitKerja = p.idUnitKerja 
join 
    JenisLayanan l on l.idJenisLayanan = p.JenisLayananID 
join 
    MasterRuangan r on r.KodeRuang = p.KodeRuang 
where 
    namabarang = 'ac' 

只查詢結果1行,因爲我想要的。如果我想要AC作爲@parameter的存儲過程只返回一行,我該怎麼辦?

謝謝

+0

你是不是在SP使用@nwhere變量的任何地方。 – Mukund

+0

這僅僅是一個例子。我的問題是我想結合多個變量。例如 組@一個=「選擇*」 組@ B =「從表」 如何加入這些變量? 所以我想要的就像@ a + @ b –

回答

1

修改你的程序如下樣品等於搜索

alter procedure GetData(@parmeter varchar(5)) 
as 
begin 

declare @basequery varchar(max); 
declare @where varchar(max); 
declare @final varchar(max); 

set @basequery='select * from doctest ' 
set @where='where docId = '[email protected] 

set @[email protected][email protected] 
execute(@final) 

end 
+1

不要這樣做。這種模式只是要求我試過的SQL注入攻擊 – Davos

+0

。但局部變量不能包含=(等於)。我如何輸入=(等於)到局部變量? –

0

打印不會是你查詢的一部分,它將從字面上只打印到SSMS或您的郵件標籤查詢工具。這對於狀態更新非常有用,而不是用於生成查詢。

請勿將varchar(max)用於參數類型。使它與namabarang字段的實際數據類型相同。如果你想能夠將多個值放入參數中,那麼這將不起作用。

ALTER PROCEDURE [dbo].[GETMONITORING] 
@namabarang varchar (max) 

SET NOCOUNT ON; 

SELECT 
    tanggalpermohonan, k.namaunitkerja, l.namajenislayanan, 
    namabarang, kodebarang, nup, r.namaruangan, p.lokasi, masalah 
FROM 
    permohonan p 
JOIN 
    UnitKerja k on k.idUnitKerja = p.idUnitKerja 
JOIN 
    JenisLayanan l on l.idJenisLayanan = p.JenisLayananID 
JOIN 
    MasterRuangan r on r.KodeRuang = p.KodeRuang 
WHERE namabarang = @namabarang 

不要這樣做:

exec GETMONITORING 'ac' 

要具體說明的模式,始終使用命名參數,因爲它會幫助你,當有多個參數,當代碼更改,

這樣做:

exec dbo.GETMONITORING @namabarang = 'ac' 
+0

謝謝。但由於某些原因,我不能用「namabarang = @namabarang」 我需要聲明並設置 –

+0

你是什麼意思你不能使用?你有一些錯誤,或者你有另一個原因? – Davos

0

試試這個:

ALTER PROCEDURE [dbo].[GETMONITORING] 
@namabarang varchar (max) 
AS 
BEGIN 

DECLARE @nWhere NVARCHAR(4000) = ' where namabarang = '''[email protected]+''''; 

DECLARE @sql NVARCHAR(MAX) = ' 
SELECT 
    tanggalpermohonan, k.namaunitkerja, l.namajenislayanan, 
    namabarang, kodebarang, nup, r.namaruangan, p.lokasi, masalah 
FROM 
    permohonan p 
JOIN 
    UnitKerja k on k.idUnitKerja = p.idUnitKerja 
JOIN 
    JenisLayanan l on l.idJenisLayanan = p.JenisLayananID 
JOIN 
    MasterRuangan r on r.KodeRuang = p.KodeRuang ' + @nWhere; 

exec sp_executesql @sql 
END 

然後:

exec dbo.GETMONITORING @namabarang = 'ac' 
相關問題