Sql server 将列名存储在变量中,并在SQL Server的查询中使用它

Sql server 将列名存储在变量中,并在SQL Server的查询中使用它,sql-server,Sql Server,我试图从用户那里获取两个输入,列名和搜索关键字,并过滤他们输入的特定列中的数据。为此,我编写了以下存储过程: Create proc spGetReference @Search nvarchar(255)=Null, --- search Key word @Column nvarchar(200)='MainCode' --- Column Name as begin With CTE_Table as ( Select

我试图从用户那里获取两个输入,列名和搜索关键字,并过滤他们输入的特定列中的数据。为此,我编写了以下存储过程:

Create proc spGetReference
    @Search nvarchar(255)=Null, --- search Key word
    @Column nvarchar(200)='MainCode' --- Column Name
as
begin
    With CTE_Table as
    (
        Select 
            ROW_NUMBER() over(order by L.MainCode) as RowNum,
            Count(*) over() as TotalRow,
            ReferenceNo,
            MainCode,
            Name,
            SettlementStatus,
            DocumentType
        FROM 
            LcDocArrived L (NOLOCK),
            Master M (NOLOCK)
        WHERE 
            ArrStatus = 'P' 
            AND M.MainCode = L.MainCode 
            AND M.BranchCode = L.BranchCode 
            AND M.BranchCode = '001'
    )
    SELECT * 
    FROM CTE_Table 
    WHERE @Search IS NULL
       OR @Column LIKE '%'+@Search+'%' 
end

exec spGetReference 'Ram','Name'
这不显示任何记录。。我认为列名不能这样使用


如何获取列名并将其用于筛选数据?

您应该以动态方式编写它

        CREATE PROC spGetReference @Search NVARCHAR(255) = NULL
        ,--- search Key word
        @Column NVARCHAR(200) = 'MainCode' --- Column Name
    AS
    BEGIN
    DECLARE @sql NVARCHAR(max) = ''

    SET @sql = '
;With CTE_Table as
(
    Select ROW_NUMBER() over(order by L.MainCode) as RowNum,
    Count(*) over() as TotalRow,
    ReferenceNo,
    MainCode,
    Name,
    SettlementStatus,
    DocumentType
    FROM LcDocArrived L (NOLOCK)
    INNER JOIN 
    Master M (NOLOCK) ON M.MainCode = L.MainCode 
    and M.BranchCode = L.BranchCode
    WHERE ArrStatus = ''P'' 
    AND M.BranchCode = ''001''
)
Select  * from CTE_Table where ' + @Search + ' Is null or ' + @Column + ' like ''%' + @Search + '%''
'

    EXEC SP_EXECUTESQL @SQL
END

EXEC spGetReference 'Ram'
    ,'Name'

你应该用动态的方式写

        CREATE PROC spGetReference @Search NVARCHAR(255) = NULL
        ,--- search Key word
        @Column NVARCHAR(200) = 'MainCode' --- Column Name
    AS
    BEGIN
    DECLARE @sql NVARCHAR(max) = ''

    SET @sql = '
;With CTE_Table as
(
    Select ROW_NUMBER() over(order by L.MainCode) as RowNum,
    Count(*) over() as TotalRow,
    ReferenceNo,
    MainCode,
    Name,
    SettlementStatus,
    DocumentType
    FROM LcDocArrived L (NOLOCK)
    INNER JOIN 
    Master M (NOLOCK) ON M.MainCode = L.MainCode 
    and M.BranchCode = L.BranchCode
    WHERE ArrStatus = ''P'' 
    AND M.BranchCode = ''001''
)
Select  * from CTE_Table where ' + @Search + ' Is null or ' + @Column + ' like ''%' + @Search + '%''
'

    EXEC SP_EXECUTESQL @SQL
END

EXEC spGetReference 'Ram'
    ,'Name'

是的,你说得对。您应该使用动态sql查询-在ANSI-92 sql标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,并且不鼓励使用动态sql查询集-不建议在任何地方都使用此样式-恰恰相反!是的,你说得对。您应该使用动态sql查询-在ANSI-92 sql标准(20多年前)中,旧样式的逗号分隔表列表样式被正确的ANSI
JOIN
语法所取代,并且不鼓励使用动态sql查询集-不建议在任何地方都使用此样式-恰恰相反!请查看我编辑的帖子。打印@SQL并在执行前检查它。它显示为空。。这意味着@sql是空的。它是如何发生的请将一些值传递给两个输入变量谢谢你兄弟的帮助。请查看我编辑的帖子。打印@SQL并在执行前检查它。它显示为空。。这意味着@sql是空的。它是如何发生的请将一些值传递给两个输入变量谢谢你兄弟的帮助。