动态SQL在运行时无法正确构造

问题描述 投票:0回答:1

我正在SQL Server中编写一个动态查询,并且遇到了一个我从未遇到过的问题,语法是正确的-我花了数小时来确保它是正确的,但是查询仍然没有给出正确的结构。当我使用打印语句检查查询时,未完全引入所选列的枢轴部分。谁看过这个吗?

alter PROCEDURE [dbo].[spFinance_NegativePlugstest2] 
@SnapshotPeriod VARCHAR(50) =NULL
, @Year INT
, @Aggs INT=1

AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @owner AS NVARCHAR(MAX),
    @ownermonths AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX), 
    @SnapshotPeriod_Local AS VARCHAR(50)=@SnapshotPeriod
    ,@Year_Local INT =@Year,
    @Aggs_Local INT =@Aggs;


IF @SnapshotPeriod_Local IS NULL
            BEGIN
            SELECT @SnapshotPeriod_Local= SnapshotPeriod
            FROM vwFin_MainData c
            WHERE IsCurrent=1
            END

SET @owner = STUFF((SELECT DISTINCT ',' + QUOTENAME(c.FinancialOwner + '_Neg') 
            FROM vwFin_MainData c
            WHERE [Year]=@Year_Local
            AND SnapshotPeriod=@SnapshotPeriod_Local
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @ownermonths = STUFF((SELECT DISTINCT ',' + QUOTENAME(c.OwnerMonth) 
            FROM (SELECT FinancialOwner  + '_' + [Month] AS OwnerMonth FROM
                (SELECT FinancialOwner, Jan AS Jan_Neg, Feb AS Feb_Neg , Mar AS Mar_Neg , Apr AS Apr_Neg , May AS May_Neg , Jun AS Jun_Neg, Jul AS Jul_Neg, Aug AS Aug_Neg, Sep AS Sep_Neg , Oct AS Oct_Neg, Nov AS Nov_Neg, Dec AS Dec_Neg
                FROM vwFin_MainData c
                WHERE [Year]=@Year_Local
                AND SnapshotPeriod=@SnapshotPeriod_Local) p
                UNPIVOT
                (Monthly FOR [Month] IN
                ([Jan_Neg], [Feb_Neg], [Mar_Neg], [Apr_Neg], [May_Neg], [Jun_Neg], [Jul_Neg], [Aug_Neg], [Sep_Neg], [Oct_Neg], [Nov_Neg], [Dec_Neg]) 
                ) AS unpvt
                )c FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

SET @query ='; WITH _MainNegView AS (
SELECT 
       CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [PCMID]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END AS [PCMID]
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [PCMNAME]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +') =2 THEN ''@Aggs''
            END AS [PCMNAME]
      ,[Year]
      ,[Tier1Name]
      ,[TIER2NAME]
      ,[TIER3NAME]
      ,[PARENTPROJECTID]
      ,[PARENTPROJECTNAME]
      ,SUM(CASE WHEN [Jan] > 0 
            THEN 0
            ELSE [Jan]
            END) AS [Jan_Neg]
      ,SUM(CASE WHEN [Feb] > 0 
            THEN 0
            ELSE Feb
            END) AS [Feb_Neg]
      ,SUM(CASE WHEN [Mar] > 0 
            THEN 0
            ELSE [Mar]
            END) AS [Mar_Neg]
      ,SUM(CASE WHEN [Apr] > 0 
            THEN 0
            ELSE [Apr]
            END) AS [Apr_Neg]
      ,SUM(CASE WHEN [May] > 0 
            THEN 0
            ELSE [May]
            END) AS [May_Neg]
      ,SUM(CASE WHEN [Jun] > 0 
            THEN 0
            ELSE [Jun]
            END) AS [Jun_Neg]
      ,SUM(CASE WHEN [Jul] > 0 
            THEN 0
            ELSE [Jul]
            END) AS [Jul_Neg]
      ,SUM(CASE WHEN [Aug] > 0 
            THEN 0
            ELSE [Aug]
            END) AS [Aug_Neg]
      ,SUM(CASE WHEN [Sep] > 0 
            THEN 0
            ELSE [Sep]
            END) AS [Sep_Neg]
      ,SUM(CASE WHEN [Oct] > 0 
            THEN 0
            ELSE [Oct]
            END) AS [Oct_Neg]
      ,SUM(CASE WHEN [Nov] > 0 
            THEN 0
            ELSE [Nov]
            END) AS [Nov_Neg]
      ,SUM(CASE WHEN [Dec] > 0 
            THEN 0
            ELSE [Dec]
            END) AS [Dec_Neg]
      , SUM(CASE WHEN [Jan] > 0 THEN 0 ELSE [Jan] END +
      CASE WHEN [Feb] > 0 THEN 0 ELSE [Feb] END + 
      CASE WHEN [Mar] > 0 THEN 0 ELSE [Mar] END +
      CASE WHEN [Apr] > 0 THEN 0 ELSE [Apr] END +
      CASE WHEN [May] > 0 THEN 0 ELSE [May] END +
      CASE WHEN [Jun] > 0 THEN 0 ELSE [Jun] END +
      CASE WHEN [Jul] > 0 THEN 0 ELSE [Jul] END +
      CASE WHEN [Aug] > 0 THEN 0 ELSE [Aug] END +
      CASE WHEN [Sep] > 0 THEN 0 ELSE [Sep] END +
      CASE WHEN [Oct] > 0 THEN 0 ELSE [Oct] END +
      CASE WHEN [Nov] > 0 THEN 0 ELSE [Nov] END +
      CASE WHEN [Dec] > 0 THEN 0 ELSE [Dec] END) AS [FYF_Neg]
      ,[ProgramLOB]
      ,[Theme]
      ,[Closed-Completed]
      , LastMonthActuals
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [ProjectLOB]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END AS [ProjectLOB]
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [ProjectLOBGroup]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END AS [ProjectLOBGroup]
      , FinancialOwner AS FinancialOwner
FROM [dbo].[vwFin_MainData]
WHERE [Year] IN  ('+ CAST(@Year_Local AS VARCHAR) +')
AND SnapshotPeriod IN (''' +@SnapshotPeriod_Local+ ''')
GROUP BY 
       CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [PCMID]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END 
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [PCMNAME]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END 
      ,[Year]
      ,[Tier1Name]
      ,[TIER2NAME]
      ,[TIER3NAME]
      ,[PARENTPROJECTID]
      ,[PARENTPROJECTNAME]
       ,[ProgramLOB]
      ,[Theme]
      ,[Closed-Completed]
      , LastMonthActuals
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [ProjectLOB]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END 
      , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [ProjectLOBGroup]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END 
      , FinancialOwner
) , _UnpivotedView AS (
SELECT 
      [ID]
    , FinancialOwner
    , [Month]
    , FinancialOwner + ''_'' + [Month] AS OwnerMonth
    , Monthly
FROM
(SELECT 
        CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [PCMID]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN [PARENTPROJECTID]
            END AS [ID]
    , FinancialOwner
    , [Jan_Neg]
    , [Feb_Neg]
    , [Mar_Neg]
    , [Apr_Neg]
    , [May_Neg]
    , [Jun_Neg]
    , [Jul_Neg]
    , [Aug_Neg]
    , [Sep_Neg]
    , [Oct_Neg]
    , [Nov_Neg]
    , [Dec_Neg]
FROM _MainNegView) p
UNPIVOT
    (Monthly FOR [Month] IN
    ([Jan_Neg], [Feb_Neg], [Mar_Neg], [Apr_Neg], [May_Neg], [Jun_Neg], [Jul_Neg], [Aug_Neg], [Sep_Neg], [Oct_Neg], [Nov_Neg], [Dec_Neg]) 
    ) AS unpvt
 SELECT 
       [ID]
 ,' + @ownermonths + ' FROM 
(SELECT [ID]
      ,OwnerMonth
      , Monthly
  FROM _UnpivotedView
) BaseTable
PIVOT
(
     SUM([Monthly]) 
     FOR OwnerMonth in (' + @ownermonths + ')
)p '

print cast(@query as ntext)
--exec(@query)


END
GO
sql-server dynamic-sql
1个回答
0
投票

我发现了问题所在,@ query是一个nvarchar(Max),但是在查询中,我传入了我要转换为varchar但未指定长度的变量,例如下面的代码位

    , CASE WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=1 THEN [ProjectLOBGroup]
            WHEN ('+ CAST(@Aggs_Local AS VARCHAR) +')=2 THEN ''@Aggs''
            END 

SQL在后台悄悄地截断了我的@query字符串。将它们强制转换为NVARCHAR(MAX)为我解决了问题]

    , CASE WHEN ('+ CAST(@Aggs_Local AS NVARCHAR(MAX)) +')=1 THEN [ProjectLOBGroup]
            WHEN ('+ CAST(@Aggs_Local AS NVARCHAR(MAX)) +')=2 THEN ''@Aggs''
            END 
© www.soinside.com 2019 - 2024. All rights reserved.