我正在尝试编写一个存储过程,该过程采用两个参数从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';
提前谢谢!
答案 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'
尝试此动态查询..