2015-11-06 111 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' 
相关问题