Sql server 带字符串参数的存储过程,如何使其工作?
我正在尝试编写一个存储过程,它使用两个参数从customers表中检索一些数据 下面是存储过程,它不检索任何数据,但是当我只键入select查询时,它就可以工作了 有人能帮我看看问题出在哪里吗Sql server 带字符串参数的存储过程,如何使其工作?,sql-server,stored-procedures,Sql Server,Stored Procedures,我正在尝试编写一个存储过程,它使用两个参数从customers表中检索一些数据 下面是存储过程,它不检索任何数据,但是当我只键入select查询时,它就可以工作了 有人能帮我看看问题出在哪里吗 CREATE PROCEDURE [dbo].[RecordsByColumnSearch] @field VARCHAR(50), @search VARCHAR(50) AS SELECT * FROM Customers WHERE @field = @sea
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';
提前谢谢你 您无法使用常规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语句并允许您传入参数。这是传入参数的最佳方式。不幸的是,这对列名不起作用,因此它们仍然需要通过搜索查询字符串来传递。使用常规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;
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
sp_executesql执行SQL语句并允许您传入参数。这是传入参数的最佳方式。不幸的是,这对列名不起作用,因此仍然需要通过Mung查询字符串来传递列名
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
用于使用存储过程
创建过程记录ByCoullMNSearch
@现场varchar50,
@搜索varchar50
像
开始
声明@sql nvarcharmax
set @sql = 'select c.* from customer c where '+@field+' = '''+@search+''''
exec sp_executesql @sql
结束
exec recordsbycoullmnsearch'Columnname','searchid'
尝试此动态查询
用于使用存储过程
创建过程记录ByCoullMNSearch
@现场varchar50,
@搜索varchar50
像
开始
声明@sql nvarcharmax
set @sql = 'select c.* from customer c where '+@field+' = '''+@search+''''
exec sp_executesql @sql
结束
exec recordsbycoullmnsearch'Columnname','searchid'
尝试此动态查询。使用您正在使用的数据库(看起来是SQL Server)标记您的问题。使用您正在使用的数据库(看起来是SQL Server)标记您的问题。非常感谢Gordon,但是当我执行时,它给了我一个错误。必须声明标量变量@search。@Zoe。这是一个愚蠢的错误。@GordonLinoff只是一个假问题,假设他正在使用SQL server,为什么他不能只编写普通SP,为什么他需要创建@sql@Jacky . . . 因为OP想要传入一个列名。要做到这一点,您需要动态SQL。非常感谢Gordon,但是当我执行时,它给了我一个错误。必须声明标量变量@search。@Zoe。这是一个愚蠢的错误。@GordonLinoff只是一个假问题,假设他正在使用SQL server,为什么他不能只编写普通SP,为什么他需要创建@sql@Jacky . . . 因为OP想要传入一个列名。要做到这一点,您需要动态SQL。虽然这样做有效,但仍存在SQL注入的可能性。使用带有适当参数的sp_executesql可以避免这种情况。虽然这样做有效,但仍存在SQL注入的可能性。使用带有适当参数的sp_executesql可以避免这种情况。