带字符串参数的存储过程,如何使其工作?

时间:2018-06-12 01:30:25

标签: sql-server stored-procedures

我正在尝试编写一个存储过程,该过程采用两个参数从customers表中检索一些数据。

下面是存储过程,它不会检索任何数据,但是当我输入select查询时,它可以正常工作。

有人可以帮我看看问题出在哪里吗?

CREATE PROCEDURE [dbo].[RecordsByColumnSearch]
    @field VARCHAR(50),
    @search VARCHAR(50)
AS
    SELECT *
    FROM Customers
    WHERE @field = @search

执行这样的存储过程:

EXEC dbo.RecordsByColumnSearch @field = CustomerID, @search = ALFKI;

不会返回任何数据,而运行此查询时会执行以下操作:

SELECT * 
FROM customers 
WHERE CustomerID = 'ALFKI';

提前谢谢!

2 个答案:

答案 0 :(得分:4)

您无法使用常规SQL执行所需操作。你需要动态SQL。我建议:

CREATE PROCEDURE [dbo].[RecordsByColumnSearch] (
    @field Varchar(50),
    @search Varchar(50)
) AS
BEGIN
    DECLARE @sql NVARCHAR(MAX);

    SET @sql = '
select c.*
from Customers c
Where @field = @search
';

    SET @sql = REPLACE(@sql, '@field', @field);
    EXEC sp_executesql @sql, N'@field nvarchar(50)', @search=@search;

END;

sp_executesql执行SQL语句并允许您传入参数。这是传递参数的最佳方式。不幸的是,这不适用于列名,所以它们仍然需要通过修改查询字符串来传递。

答案 1 :(得分:0)

declare @field varchar(40)
declare @search varchar(40)

declare @sql nvarchar(max)

set @sql = 'select c.* from Customers c where '+@field+' = '''+@search +''''

exec sp_executesql @sql

使用存储过程

create proc recordsbycoulmnsearch
@field varchar(50),
@search varchar(50)
 作为
 开始
    声明@sql nvarchar(max)

set @sql = 'select c.* from customer c where '+@field+' = '''+@search+''''

exec sp_executesql @sql

exec recordsbycoulmnsearch' Columnname',' searchid'

尝试此动态查询..