【问题标题】:CASE statement using DYNAMIC sql inside stored proc在存储过程中使用 DYNAMIC sql 的 CASE 语句
【发布时间】:2017-07-13 16:57:26
【问题描述】:

我正在尝试通过将动态 SQL 存储在存储过程中的变量中来构建 CASE WHEN 语句,但出现以下错误。有人可以分享您对如何解决此错误的想法。谢谢。

--代码

SELECT
             CASE WHEN  ResultTableName LIKE '%Loss_ByEvent]'
                  THEN  @SQLStmt =
                        N'CREATE TABLE dbo.' + ResultTableName + N' (
                        ' + CreateStmt + N'
                        ) ON Loss_ByAnalysis(SliceID)'                    
                  WHEN  ResultTableName LIKE '%Loss_ByGeo]'
                  THEN  @SQLStmt =
                        N'CREATE TABLE dbo.' + ResultTableName + N' (
                        ' + CreateStmt + N'
                        ) ON Loss_ByAnalysis(SliceID)'                    
                  ELSE 
                  @SQLStmt =
                        N'CREATE TABLE dbo.' + ResultTableName + N' (
                        ' + CreateStmt + N'
                        )'
              END
            ,@DBName = DBName
            ,@ResultTableName = ResultTableName
        FROM #CreateResult_ResultTables lr
        WHERE ID = @ResultTableCount;

--错误:-

Msg 102, Level 15, State 1, Procedure Procedure_name, Line 141 [Batch Start Line 7]
Incorrect syntax near '='.

【问题讨论】:

  • 为什么需要存储过程来创建表?这对我来说似乎很可怕,并且很可能容易受到 sql 注入的影响。
  • 应用程序中有一个现有的存储过程......在while循环中,它遍历表名列表并创建表。但我想为几个表名使用分区创建表..
  • THEN 接受表达式,而不是语句,CASE ... END 的结果本身就是一个表达式。 SELECT @SQLStmt = CASE WHEN ... THEN N'' ELSE ... END.
  • @Jeoren 你能帮我重写代码吗...

标签: sql sql-server stored-procedures sql-server-2012 sql-server-2016


【解决方案1】:

您收到错误,因为 CASE 是 SQL 中的 函数,但您正在使用它,就好像它是一个语句或列形式。

SELECT
     @SQLStmt =
         CASE WHEN  ResultTableName LIKE '%Loss_ByEvent]'
              THEN  N'CREATE TABLE dbo.' + ResultTableName + N' (
                    ' + CreateStmt + N'
                    ) ON Loss_ByAnalysis(SliceID)'                    
              WHEN  ResultTableName LIKE '%Loss_ByGeo]'
              THEN  N'CREATE TABLE dbo.' + ResultTableName + N' (
                    ' + CreateStmt + N'
                    ) ON Loss_ByAnalysis(SliceID)'                    
              ELSE 
                    N'CREATE TABLE dbo.' + ResultTableName + N' (
                    ' + CreateStmt + N'
                    )'
          END
        ,@DBName = DBName
        ,@ResultTableName = ResultTableName
    FROM #CreateResult_ResultTables lr
    WHERE ID = @ResultTableCount;

@SeanLange 是正确的,这非常容易受到 SQL 注入的影响。

【讨论】:

  • 它工作得很好 RbarryYoung...非常感谢... :)
【解决方案2】:

你试过这种方法吗

SELECT
                 CASE WHEN  ResultTableName LIKE '%Loss_ByEvent]'
                      THEN  'CREATE TABLE dbo.' + ResultTableName + N' (
                            ' + CreateStmt + N'
                            ) ON Loss_ByAnalysis(SliceID)'                    
                      WHEN  ResultTableName LIKE '%Loss_ByGeo]'
                      THEN 
                            N'CREATE TABLE dbo.' + ResultTableName + N' (
                            ' + CreateStmt + N'
                            ) ON Loss_ByAnalysis(SliceID)'                    
                      ELSE 
                            N'CREATE TABLE dbo.' + ResultTableName + N' (
                            ' + CreateStmt + N'
                            )'
                  END AS Sqlstmt
                ,@DBName = DBName
                ,@ResultTableName = ResultTableName
            FROM #CreateResult_ResultTables lr
            WHERE ID = @ResultTableCount;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-26
    • 2011-04-29
    • 1970-01-01
    • 2019-07-23
    • 2014-12-01
    • 2018-06-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多