代码之家  ›  专栏  ›  技术社区  ›  pro_data

如何解决SQL Server中的以下错误消息“字符串后未闭合的引号”?

  •  0
  • pro_data  · 技术社区  · 2 年前

    下面是我创建并在其中插入值的表格:

    CREATE TABLE prod_sales   
    (saleID int identity(1,1),   
    saleDate date,  
    department varchar(125),   
    amount int )  
    GO   
      
    INSERT INTO prod_sales VALUES   
    ('2016-01-01','Men''s Clothing & Accessories' ,ROUND(RAND() * 1000, 0)),  
    ('2016-01-02','Phones & Telecommunications',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Computer & Office',ROUND(RAND() * 1000, 0)),  
    ('2016-01-02','Consumer Electronics',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Men''s Clothing & Accessories' ,ROUND(RAND() * 1000, 0)),  
    ('2016-01-02','Phones & Telecommunications',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Computer & Office',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Consumer Electronics',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Men''s Clothing Accessories' ,ROUND(RAND() * 1000, 0)),  
    ('2016-01-02','Phones & Telecommunications',ROUND(RAND() * 1000, 0)),  
    ('2016-01-02','Computer & Office',ROUND(RAND() * 1000, 0)),  
    ('2016-01-01','Consumer Electronics',ROUND(RAND() * 1000, 0))  
    GO 
    
    SELECT * FROM prod_sales
    

    enter image description here

    我的目标是显示每个部门每天的销售额总和 动态枢轴 查询结果应该如下面的屏幕截图所示:

    enter image description here

    为了实现我的目标,我为Dynamic PIVOT创建了一个存储过程,如下所示:

    CREATE OR ALTER PROCEDURE DynamicPivot
    @ColumnToPivot VARCHAR(50),
    @ListToPivot VARCHAR(50)
    AS
    BEGIN
    DECLARE @SqlStatement VARCHAR(MAX)
    SET @SqlStatement =
    'SELECT saleDate,[Computer & Office],[Consumer Electronics],[Men''s Clothing & Accessories],[Phones & Telecommunications]
    FROM
    (
     SELECT saleDate,department,amount
     FROM prod_sales
    ) AS DataSource
    PIVOT
    (
     SUM(amount)
     FOR ['+@ColumnToPivot+'] IN ('+@ListToPivot+')
    ) AS Pivoting'
    EXECUTE (@SqlStatement)
    END
    
    EXECUTE DynamicPivot 'department','[Computer & Office],[Consumer Electronics],[Men''s Clothing & Accessories],[Phones & Telecommunications]'
    

    存储过程已成功创建,但在执行存储过程后,它会显示一条错误消息,如下所示:

    enter image description here

    如何解决这个问题?

    1 回复  |  直到 2 年前
        1
  •  2
  •   Aaron Bertrand    2 年前

    问题与单引号无关,而是当您显然需要更多字符时,将字符串设置为50个字符:

    @ListToPivot VARCHAR(50)
    

    尝试:

    @ListToPivot varchar(4000)
    

    另外,为什么存储过程会对作为参数传递的列列表进行硬编码?这也解决了这个问题: