2013-07-10 3 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 

Может у решения этой проблемы?

+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

создать таблицу, в которой будут храниться все имена таблиц, которые будут обрабатываться, и прокрутить эту таблицу внутри вашего sproc.

Смежные вопросы