列名在存储过程中设置但不起作用

时间:2013-12-05 12:02:40

标签: sql-server-2008

在存储过程中设置的列名但不起作用。但是当我运行此脚本时,会出现空行。我这样做是为了运行这个脚本吗?

Create Procedure Test
()
AS
BEGIN
   Declare @columnName nvarchar(50);

   set @columnName ='StoreName';

   SELECT * 
   FROM testtable 
   WHERE @columnName = 'storemanager'
END

1 个答案:

答案 0 :(得分:5)

您需要使用动态SQL,因为您无法使用变量引用列--T-SQL只是不按该顺序解析事物。尝试类似:

CREATE PROCEDURE dbo.Test
  @columnName NVARCHAR(50),
  @value NVARCHAR(4000)
AS
BEGIN
  SET NOCOUNT ON;

  DECLARE @sql NVARCHAR(MAX);

  SET @sql = N'SELECT * FROM dbo.testtable WHERE '
    + QUOTENAME(@columnName) + ' = @value;';

  EXEC sp_executesql @sql, N'@value NVARCHAR(4000)', @value;
END
GO

QUOTENAME()将列包装在[square brackets]中,希望能够保护您免受SQL注入。您还应该阅读这些帖子: