带有where参数的SQL Server动态crosstb查询

时间:2016-05-14 19:36:45

标签: sql-server

在下面的动态查询中,我收到此错误

  

必须声明标量变量“@κωδ_κατηγ2”

WHERE (κωδ_κατηγ = @κωδ_κατηγ2)

中设置@query

如果设置WHERE (κωδ_κατηγ = 1)正常。

如何解决此错误?

如何将ControlParameter @κωδ_κατηγ2中的值传递给@query

<asp:SqlDataSource ID="apotelesmata_diast_db" runat="server" 
     ConnectionString='<%$ ConnectionStrings:epsa_mssql %>'
     SelectCommand="DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)                

  SELECT @cols = STUFF((SELECT ',' + QUOTENAME(Ομάδα1) FROM ( SELECT κωδ_κατηγ, Ομάδα1 FROM [2014_2015].[αποτελεσματα_ερ2] ) d  
            WHERE (κωδ_κατηγ = @κωδ_κατηγ1) GROUP BY κωδ_κατηγ, Ομάδα1 ORDER BY Ομάδα1 FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'') 

  SET @query = 'SELECT Ομάδα2,' + @cols + ' 
        from 
        (select κωδ_κατηγ, Ομάδα1, Ομάδα2, Σκορ
            from [2014_2015].[αποτελεσματα_ερ2] pd 
            WHERE (κωδ_κατηγ = @κωδ_κατηγ2)
            GROUP BY κωδ_κατηγ, Ομάδα1, Ομάδα2, Σκορ) x             
        pivot 
        (max(Σκορ) for Ομάδα1 in (' + @cols + ')) p '                 
            EXEC sp_executesql @query;">
     <SelectParameters>
         <asp:ControlParameter ControlID="katigoties_ddl" 
              PropertyName="SelectedValue" Name="κωδ_κατηγ1" Type="Int16">
         </asp:ControlParameter>
         <asp:ControlParameter ControlID="katigoties_ddl" 
              PropertyName="SelectedValue" Name="κωδ_κατηγ2" Type="Int16">
         </asp:ControlParameter>                    
     </SelectParameters>
 </asp:SqlDataSource>

2 个答案:

答案 0 :(得分:0)

更改此部分:

'WHERE (κωδ_κατηγ = @κωδ_κατηγ2)'

关于这个:

'WHERE (κωδ_κατηγ = ' + CAST(@κωδ_κατηγ2 as nvarchar(10)) + ')'

执行动态查询时发生错误。它无法获得一个不属于动态查询的变量。

答案 1 :(得分:0)

您可以使用paramdef

将参数发送到动态查询
declare @paramdef nvarchar(max) = N'@κωδ_κατηγ2 int, @κωδ_κατηγ1 int';
EXEC sp_executesql @query, @paramdef, @κωδ_κατηγ1=@κωδ_κατηγ1, @κωδ_κατηγ2=@κωδ_κατηγ2;