2013-07-10 69 views
2

我想通过传递表名作为参数在多个表下执行存储过程。对多个表执行存储过程

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
CREATE PROCEDURE GETARTICLESPAGEWISE 
    @PageIndex INT = 1 
    ,@PageSize INT = 10 
    ,@ArticleCategory varchar(100) = 'null' 
    ,@RecordCount INT OUTPUT 

AS 
BEGIN 
    SET NOCOUNT ON; 
    SELECT ROW_NUMBER() OVER 
    (
     ORDER BY [ArticleID] ASC 
)AS RowNumber 
    ,[ArticleID] 
    ,[ArticleName] 
    ,[ArticleCategory] 
INTO #ResultSet 
    FROM [ASPDOTNETARTICLES] 
    WHERE ArticleCategory = @ArticleCategory 
    SELECT @RecordCount = COUNT(*) 
    FROM #ResultSet 

    SELECT * FROM #ResultSet 
    WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) +    @PageSize) - 1 

    DROP TABLE #ResultSet 
END 
GO 


--EXEC dbo.GETARTICLESPAGEWISE @PageIndex =1, @PageSize = 2,   @ArticleCategory='Gridview',@RecordCount=0 

我试过,但出现错误,试图存储过程

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
-- ============================================= 
ALTER PROCEDURE GETARTICLESPAGEWISEGENERIC 
     @PageIndex INT = 1 
     ,@PageSize INT = 10 
     ,@ArticleCategory varchar(100) = 'null' 
     ,@RecordCount INT OUTPUT 
     ,@TableName varchar(100) = 'NULL' 
AS 
BEGIN 
DECLARE @columnList varchar(200) 
SET @columnList=' SELECT ROW_NUMBER() OVER 
     (
      ORDER BY [ArticleID] ASC 
    )AS RowNumber 
     ,[ArticleID] 
     ,[ArticleName] 
     ,[ArticleCategory]' 

     SET NOCOUNT ON; 
DECLARE @sqlCommand varchar(300) 

set @sqlCommand =' 
    SELECT '+ @columnList +' 
    INTO #ResultSet 
     FROM '+ @TableName +' 
     WHERE ArticleCategory ='+ @ArticleCategory+' 
     //i got the error in this statement 
     SELECT @RecordCount = COUNT(*) 
     FROM #ResultSet 

     SELECT * FROM #ResultSet 
     // i got the error in this statement 
     WHERE RowNumber BETWEEN(@PageIndex -1) * @PageSize + 1 AND(((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1 

     DROP TABLE #ResultSet' 
END 
GO 

u能给出这个问题的解决方案?

+0

这通常是一个迹象,表明你的表的设计被打破 - 如果有多个表包含相同的数据“排序”,这样是有意义的互换对它们进行查询,它通常是因为它们应该是一个单独的表格,其中有额外的列存储当前嵌入表格名称中的数据。例如。经典的例子是你可能不应该有'MaleEmployees'和'FemaleEmployees'表。 –

回答

2

尝试这一个 -

CREATE PROCEDURE GETARTICLESPAGEWISE 

     @PageIndex INT = 1 
    , @PageSize INT = 10 
    , @ArticleCategory VARCHAR(100) = 'null' 
    , @TableName VARCHAR(100) = 'dbo.ASPDOTNETARTICLES' 
    , @RecordCount INT OUTPUT 

AS BEGIN 

    SET NOCOUNT ON; 

    IF OBJECT_ID (N'tempdb.dbo.##ResultSet') IS NOT NULL 
     DROP TABLE ##ResultSet 

    DECLARE @SQL NVARCHAR(MAX) = ' 
    SELECT 
      RowNumber = ROW_NUMBER() OVER (ORDER BY ArticleID) 
     , ArticleID 
     , ArticleName 
     , ArticleCategory 
    INTO ##ResultSet 
    FROM ' + @TableName + ' 
    WHERE ArticleCategory = ''' + @ArticleCategory + '''' 

    EXEC sys.sp_executesql @SQL 

    SELECT @RecordCount = COUNT(*) 
    FROM ##ResultSet 

    SELECT * 
    FROM ##ResultSet 
    WHERE RowNumber BETWEEN (@PageIndex - 1) * @PageSize + 1 AND (((@PageIndex - 1) * @PageSize + 1) + @PageSize) - 1 

END 
+0

感谢您的解决方案,它的工作。 –

+0

不客气@giri。 – Devart

+1

你可以删除*在“SELECT * RowNumber” –

0

创建一个表,它将保存所有要处理的表名并通过此表循环遍历您的存储过程。