【问题标题】:SQL Server 2008 R2: Prepare dynamic temporary VIEWSQL Server 2008 R2:准备动态临时视图
【发布时间】:2016-01-26 16:57:38
【问题描述】:

表格

CREATE TABLE Test_01
(
    Cola VARCHAR(MAX),
    Colb VARCHAR(MAX)
);

INSERT INTO Test_01 VALUES(1,'A');

CREATE TABLE Test_02
(
    Cola VARCHAR(MAX),
    Colb VARCHAR(MAX)
);

INSERT INTO Test_02 VALUES(2,'B');

CREATE TABLE Test_03
(
    Cola VARCHAR(MAX),
    Colb VARCHAR(MAX)
);

INSERT INTO Test_01 VALUES(3,'C');

查看

CREATE VIEW View_Test AS 
SELECT * FROM Test_01 UNION ALL 
SELECT * FROM Test_02 UNION ALL 
SELECT * FROM Test_03 UNION ALL;

记录

SELECT * FROM dbo.View_test

Cola        Colb
------------------
1       A
2       B
3       C

注意:现在我想通过将Cola 值传递给存储过程来准备一个临时视图。

示例:如果我将 Value 1 传递给存储过程,那么它应该准备一个临时视图 使用表 test_01,因为记录 1 属于表 test_01

如果我将 Value 1,2,3 传递给存储过程,那么它应该准备一个临时视图 使用表的test_01,test_02,test_03,因为记录1,2,3 属于表test_01,test_02,test_03

针对上述要求,我编写了以下存储过程:

存储过程

ALTER PROCEDURE sp_Test_90
@Cola varchar(MAX)

AS

DECLARE @SQL VARCHAR(MAX)
DECLARE @Tab VARCHAR(MAX)
DECLARE @Query VARCHAR(MAX)

    DECLARE Cur CURSOR FAST_FORWARD FOR 
    SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEW_TABLE_USAGE
    WHERE VIEW_NAME = 'View_Test'

    OPEN Cur 
    FETCH NEXT FROM Cur INTO @Tab
    WHILE(@@FETCH_STATUS=0)
    BEGIN

        IF OBJECT_ID('tempdb..#Temp') IS NOT NULL 
        BEGIN
                DROP TABLE #Temp
        END

        CREATE TABLE #Temp
        (
            ColaValues VARCHAR(MAX)
        );

        SET @SQL = 'INSERT INTO #Temp(ColaValues) SELECT DISTINCT Cola FROM ['+@Tab+'] WHERE Cola IN('''+REPLACE(@Cola,',',''',''')+''')';
        PRINT(@SQL);
        EXECUTE(@SQL);

        ----------------------
        /*Got Stuck HERE*/
        ----------------------
        IF (SELECT DISTINCT colavalues FROM #Temp)  IN(''''+REPLACE(@Cola,',',''',''')+'''')---IN (@Cola) -------GOT STUCK HERE
        BEGIN

            SET @SQL +='SELECT * FROM ['+@Tab+'] UNION ALL';

        END
        FETCH NEXT FROM Cur INTO @Tab

    END

    CLOSE Cur;

    DEALLOCATE Cur;

    SET @Query = 'WITH CTE
              AS
                          (
                              '+@SQL+'
              ) 
                          SELECT * FROM CTE';

    PRINT(@Query);
    EXECUTE(@Query);

GO

但是卡在 if 条件中检查给定参数中是否存在可乐​​值。

【问题讨论】:

  • “临时视图”的概念真的不清楚。你能告诉我们你的意思和它的目的吗?
  • 旁注:CREATE PROCEDURE:“在命名过程时避免使用 sp_ 前缀。SQL Server 使用此前缀来指定系统过程。”
  • @Damien_The_Unbeliever,好的!感谢您的信息。

标签: sql sql-server stored-procedures sql-server-2008-r2


【解决方案1】:

您不想要临时视图。你想要一个内联表值函数:

create function udf_myview (
    @cola varchar(max)
   )
returns table
as
    return(select *
           from dbo.View_Test
           where cola = @cola
          );

你可以这样称呼它:

select *
from dbo.udf_myview('XYZ');

【讨论】:

  • 如果我想将多个值传递给@Cola,因为我想显示来自多个表的记录。例如@Cola = 1,2,3?
  • @Mak 。 . .这是一个不同的问题,应该作为一个问题提出。但是,它是对用户自定义函数的一个比较简单的修改。