【问题标题】:SQL Server stored procedure declare variableSQL Server 存储过程声明变量
【发布时间】:2015-11-06 02:17:58
【问题描述】:

我有一个这样的存储过程

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

谢谢

【问题讨论】:

  • 你没有在 SP 的任何地方使用@nwhere 变量。
  • 这只是一个例子。我的问题是我想组合多个变量。例如 set @a= 'select * ' set @b= 'from table' 如何加入这些变量?所以我想要的只是@a+@b

标签: sql-server variables set declare


【解决方案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

【讨论】:

  • 不要这样做。这种模式只是要求进行 SQL 注入攻击
  • 我试过了。但是局部变量不能包含=(等于)。如何将 =(equal) 输入到局部变量中?
【解决方案2】:

打印不会成为您查询的一部分,它只会打印到 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'

【讨论】:

  • 谢谢。但由于某种原因,我不能使用 'namabarang = @namabarang' 我需要声明和设置
  • 你不能使用它是什么意思?你有什么错误,还是有其他原因?
【解决方案3】:

试试这个:

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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2020-01-05
    • 1970-01-01
    相关资源
    最近更新 更多