带有字符串参数的存储过程,如何让它工作?

Zoe*_*Zoe 1 sql-server stored-procedures

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

下面是存储过程,它不检索任何数据,但是当我只需键入选择查询时,它就可以工作。

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

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

像这样执行这个存储过程:

EXEC dbo.RecordsByColumnSearch @field = CustomerID, @search = ALFKI;
Run Code Online (Sandbox Code Playgroud)

不返回任何数据,而运行此查询时会:

SELECT * 
FROM customers 
WHERE CustomerID = 'ALFKI';
Run Code Online (Sandbox Code Playgroud)

先感谢您 !

Gor*_*off 6

您无法使用常规 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;
Run Code Online (Sandbox Code Playgroud)

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