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

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

我正在尝试编写一个存储过程,它使用两个参数从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';

提前谢谢你

您无法使用常规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可以避免这种情况。