0

我想通過在存儲過程中的變量中存儲動態SQL來構建CASE WHEN語句,但我得到下面的錯誤。有人可以分享你的想法如何解決這個錯誤。謝謝。CASE語句在存儲過程中使用DYNAMIC SQL

--Code

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; 

--error: -

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

enter image description here

+1

爲什麼你需要一個存儲過程創建表?這對我來說似乎非常可怕,並且極有可能容易受到sql注入的影響。 –

+0

在應用程序中存在一個現有的存儲過程...在while循環中,它遍歷表名列表並創建表。但我想要使用分區來創建表,以便對錶名進行分區。 – Teja

+0

'THEN'接受表達式,而不是語句,並且'CASE ... END'的結果本身就是一個表達式。 'SELECT @SQLStmt = CASE WHEN ... THEN N'ELSE ... END'。 –

回答

2

因爲CASE是功能在SQL你得到一個錯誤,但你正在使用它,好像它是一個政治家t或列形式。

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注入非常脆弱。

+1

它工作得很好RbarryYoung ...非常感謝你...... :) – Teja

0

你有沒有嘗試過這種方式

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; 
相關問題