SQL Server存储过程声明变量

时间:2015-11-06 02:17:58

标签: sql-server variables set declare

我有一个像这样的存储过程

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

    SET NOCOUNT ON;

    DECLARE @nWhere varchar(4000)
    SET @nwhere = ' where namabarang=''+@namabarang+'''

    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

我使用'ac'作为@namabarang的参数来执行该存储过程,并且它会产生所有行。如果我在这样的查询中运行

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的存储过程只返回一行,我该怎么办?

谢谢

3 个答案:

答案 0 :(得分: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 = '+@parmeter

set @final=@basequery+@where
execute(@final)

end

答案 1 :(得分: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'

答案 2 :(得分:0)

试试这个:

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

DECLARE @nWhere NVARCHAR(4000) = ' where namabarang = '''+@namabarang+'''';

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'