如何在SQL Server中的CTE内执行字符串作为查询

viv*_*vek 0 sql sql-server

我正在使用下面的CTE ...但我得到的错误就像

没有为'TempResult'的第1列指定列名.

另外在这里我@Query从另一个存储过程传递,在这个过程中我需要@Query在CTE中执行它TempResult.

CREATE PROCEDURE [dbo].[SelectAllProjectPaging]      
    @CurrentPage int,                          
    @RecordsPerPage int,  
    @Column varchar(50),  
    @Query nvarchar(max)   
AS      
BEGIN      
    -- SET NOCOUNT ON added to prevent extra result sets from      
    -- interfering with SELECT statements.      
    SET NOCOUNT ON;      

    DECLARE @query nvarchar(max)
    SET @query = 'ROW_NUMBER() OVER(ORDER BY ProjectList.ProjectId DESC) as RowNumber,' + @Query

    -- Insert statements for procedure here      
    DECLARE @FirstRecord int, @LastRecord int                       

    SELECT @FirstRecord = (@CurrentPage - 1) * @RecordsPerPage              
    SELECT @LastRecord = (@CurrentPage * @RecordsPerPage + 1);              

    WITH TempResult as              
    (                                
         Select @query
    )            
    SELECT TOP (@LastRecord - 1) *  
    FROM TempResult              
    WHERE RowNumber > @FirstRecord 
      AND RowNumber < @LastRecord;              

    SELECT COUNT(*) as count 
    FROM ProjectList          
 End
Run Code Online (Sandbox Code Playgroud)

Ari*_*ion 5

您需要使用动态sql进行整个查询.这样的事情:

SET @query= 'WITH TempResult as              
             (                                
                SELECT + ' + @query + 
            ')            
             SELECT TOP (' + CAST((@LastRecord - 1) AS VARCHAR(20)) +
            ') * FROM TempResult              
             WHERE RowNumber > ' + CAST(@FirstRecord AS VARCHAR(20)) +
           ' AND RowNumber < ' + CAST(@LastRecord AS VARCHAR(20)) + '; '

EXECUTE @query
Run Code Online (Sandbox Code Playgroud)

编辑

评论.是的它应该选择我能看到的东西.该@queryIS等于:

set @query = 'ROW_NUMBER() OVER(ORDER BY ProjectList.ProjectId DESC) as RowNumber,'+ @query
Run Code Online (Sandbox Code Playgroud)

然后你需要:

SELECT ' ROW_NUMBER() OVER(ORDER BY ProjectList.ProjectId DESC) as RowNumber,' + @query
Run Code Online (Sandbox Code Playgroud)