首页 > 解决方案 > 有没有办法通过 WHERE 子句中的 DECLARE 指向表中的特定列?

问题描述

我正在尝试创建一个有点动态的搜索字符串,并且我正在尝试解决一个大型 CASE WHEN 场景,但在我求助于做一个 CASE WHEN 之前,我在这里试试运气。

我试图以字符串格式“exec('code')”在它工作的地方执行它,但后来我遇到了 getdate() 的另一个问题,我不会详细说明。

DECLARE @ProductLines nvarchar(50) = 'usr_author'
DECLARE @searchProductlines nvarchar(50) = 'hc'

SELECT TOP 20
    Productid as Produktid,
    usr_Author AS Author,
    Header AS Title,
    usr_Publisher AS Publisher,
    CustomerId AS Customerid, FROM Products
        WHERE 
       (@ProductLines Like '%' + @searchProductlines + '%')

我已经删除了所有其他与此处无关的代码。我想要做的是将@ProductLines 声明为列'usr_author',这样我在WHERE 子句中可以稍后在下拉菜单中使用@ProductLines 作为动态列选择器。

但是,这不起作用。如果我写 usr_Author 而不是 @ProductLines,我会得到我需要的结果,但它是一个静态解决方案,而不是一个动态解决方案。在这种情况下,最佳做法是什么?

标签: sqlsql-server

解决方案


您只能使用参数替换常量值。您不能替换标识符——包括列名、表名等。

您可以动态执行此操作:

DECLARE @col nvarchar(50) = 'usr_author'
DECLARE @search nvarchar(50) = 'hc'

DECLARE @sql NVARCHAR(MAX);

SET @sql = '
SELECT TOP 20
    Productid as Produktid,
    usr_Author AS Author,
    Header AS Title,
    usr_Publisher AS Publisher,
    CustomerId AS Customerid
FROM Products
WHERE @col Like ''%'' + @search + ''%''
';

SET @sql = REPLACE(@sql, '@col', @col);

EXEC sp_executesql @sql,
                   N'@search nvarchar(50)',
                   @search=@search;

推荐阅读