【问题标题】:Create a dynamic SQL Where clause that both parts of the where statement are passed in parameters? i.e. Where Variable1 = Variable2创建一个动态 SQL Where 子句,将 where 语句的两个部分都传入参数?即其中变量 1 = 变量 2
【发布时间】:2020-02-17 08:33:15
【问题描述】:

我见过很多动态 where 子句的例子,但没有一个能涵盖我遇到的问题。有没有可能?

Create Procedure ManualParse2
    (
        @Variable1 AS nvarchar(MAX) 
        ,@Variable2 AS nvarchar(MAX)
    )
AS
    Select * 
    From Faculty
    Where @Variable1
        Case
            When @Variable1 = 'Department' THEN Department
            When @Variable1 = 'Name' THEN Name
            When @Variable1 = 'Gender' THEN Gender
            When @Variable1 = 'FacultyID' THEN FacultyID
        END
        = @Variable2

EXEC ManualParse2 @Variable1 = 'Gender', @Variable2 = 'Male'

【问题讨论】:

  • @Variable1 是否总是包含有效的字段名称?
  • WHERE @Variable1 是什么意思?这看起来也不像动态 SQL,只是“正常”的布尔逻辑。如果您不引用表中的列,WHERE 将毫无意义。
  • 你也没有在你的SP中声明@Variable,只有@Variable1@Variable1;后者你不使用。 @Variable 实际上是 @Variable2。 (注意,这些实际上是参数,而不是变量。
  • 在这种特定情况下,@Variable1 将始终包含有效的列名。
  • 这让我想到了我的问题,@DanielSteck,WHERE @Variable1 是什么意思?在哪里@Variable1 什么..?

标签: sql-server tsql where-clause dynamic-sql


【解决方案1】:

字里行间,但我怀疑你真正想要的是:

CREATE PROC dbo.ManualParse2 @ColumnName sysname, @ColumnValue nvarchar(50) AS --You aren't going to have a department with 1 billion characters in it
                                                                               --sysname is the correct data type for object names (it's a synonym for nvarchar(128) NOT NULL)
BEGIN

    DECLARE @SQL nvarchar(MAX),
            @CRLF nchar(2) = NCHAR(13) + NCHAR(10);
    SET @SQL = N'SELECT *' + @CRLF + --This should reallty be a column list
               N'FROM dbo.Faculty' + @CRLF +
               N'WHERE ' + QUOTENAME(@ColumnName) + N' = @ColumnValue;';

    --PRINT @SQL; --Unlikely to be needed for such a simple statement, but your debugging friend    
    EXEC sp_executesql @SQL, N'@ColumnValue nvarchar(50)', @ColumnValue;
END;
GO

【讨论】:

    猜你喜欢
    • 2016-12-06
    • 2014-04-11
    • 2018-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-16
    • 1970-01-01
    • 2017-07-21
    相关资源
    最近更新 更多