在存储过程中使用动态sql的CASE语句

在存储过程中使用动态sql的CASE语句,sql,sql-server,stored-procedures,sql-server-2012,sql-server-2016,Sql,Sql Server,Stored Procedures,Sql Server 2012,Sql Server 2016,我试图通过将动态SQL存储在存储过程中的变量中来构建CASE-WHEN语句,但我得到了以下错误。有人能分享一下你对如何解决这个错误的想法吗。多谢各位 --代码 SELECT CASE WHEN ResultTableName LIKE '%Loss_ByEvent]' THEN @SQLStmt = N'CREATE TABLE dbo.' + ResultTableName + N

我试图通过将动态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 '='.

由于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注入的攻击。

您会收到一个错误,因为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注入的攻击。

您尝试过这种方法吗

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;

你试过这种方法吗

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;

为什么需要存储过程来创建表?这对我来说非常可怕,很可能容易受到sql注入的攻击。应用程序中存在一个现有的存储过程。。。在while循环中,它遍历表名列表并创建表。但我想为两个表名使用分区来创建表。
然后
接受表达式,而不是语句,以及
大小写的结果。。。END本身就是一个表达式<代码>选择@SQLStmt=CASE当。。。然后,其他的。。。END
@Jeoren您能帮我重新编写代码吗…为什么需要存储过程来创建表?这对我来说非常可怕,很可能容易受到sql注入的攻击。应用程序中存在一个现有的存储过程。。。在while循环中,它遍历表名列表并创建表。但我想为两个表名使用分区来创建表。
然后
接受表达式,而不是语句,以及
大小写的结果。。。END本身就是一个表达式<代码>选择@SQLStmt=CASE当。。。然后,其他的。。。结束
@Jeoren你能帮我重新编写代码吗…它在Arryyoung工作得很好。。。非常感谢……:)它很好地工作了很久。。。非常感谢……:)