【问题标题】:How to Create View based on the Set of SQL Statements using SQL Server 2005?如何使用 SQL Server 2005 创建基于 SQL 语句集的视图?
【发布时间】:2011-06-14 05:45:09
【问题描述】:

我已经编写了一组 SQL 语句,最终给出了一个表。我想将整套语句创建为“视图”。我怎么得到它? 声明如下:

------------ Creating TempTable(#MasterTable) ----------------------
CREATE TABLE #MasterTable
    (ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50), 
            D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50))

------------ Creating TempTable(#TempItems) ----------------------

CREATE TABLE #TempItems(ItemID INT, ItemName VARCHAR(100), Specifications VARCHAR(100), D1 VARCHAR(50), D2 VARCHAR(50), D3 VARCHAR(50),
                     D1_Code VARCHAR(50), D2_Code VARCHAR(50), D3_Code VARCHAR(50))
------------ Creating & Inserting TempTable(@Dim) ----------------------

DECLARE @Dim TABLE (DCodes VARCHAR(100))
INSERT INTO @Dim SELECT  D1_Code FROM MAS_SizeType WHERE  D1_Code <> ''
INSERT INTO @Dim SELECT  D2_Code FROM MAS_SizeType WHERE  D2_Code <> ''
INSERT INTO @Dim SELECT  D3_Code FROM MAS_SizeType WHERE  D3_Code <> ''

------------ Inserting data into TempTable(#MasterTable) ----------------------

INSERT INTO #MasterTable
SELECT     STR_Item.ItemID, STR_Item.ItemName, STR_Item_Specifications.SpecificationName, 
            STR_Item.D1, STR_Item.D2, STR_Item.D3, MAS_SizeType.D1_Code, MAS_SizeType.D2_Code, 
                      MAS_SizeType.D3_Code
FROM         STR_Item INNER JOIN
                      MAS_SizeType ON STR_Item.SizeTypeID = MAS_SizeType.SizeTypeID INNER JOIN
                      STR_Item_Specifications ON STR_Item.SpecificationID = STR_Item_Specifications.SpecificationID

-------------------- Inserting Data into #TempItems Table ----------------------------
INSERT INTO #TempItems
    SELECT 
          *
    FROM #MasterTable

------------------Cursor for All dimensions details into single row for each items ----------------------

DECLARE @DCode VARCHAR(MAX), @Cnt INT
SET @Cnt = 0

DECLARE ColAdd CURSOR FOR
    SELECT DISTINCT DCodes FROM @Dim
OPEN ColAdd
FETCH NEXT FROM ColAdd INTO @DCode
WHILE (@@FETCH_STATUS = 0)
BEGIN
    SET @Cnt = 1
        EXECUTE ('ALTER TABLE #TempItems ADD ' + @DCode + ' VARCHAR(50)')
        EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D1
                    FROM #MasterTable M 
                INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D1_Code = ''' + @DCode + '''')
        EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D2
                    FROM #MasterTable M 
                INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D2_Code = ''' + @DCode + '''')
        EXECUTE('UPDATE #TempItems SET [' + @DCode + '] = M.D3
                    FROM #MasterTable M 
                INNER JOIN #TempItems T ON T.ItemID = M.ItemID AND M.D3_Code = ''' + @DCode + '''')


        FETCH NEXT FROM ColAdd INTO @DCode
END
CLOSE ColAdd
DEALLOCATE ColAdd
IF (@Cnt = 1)
BEGIN

    SELECT  @DCode = STUFF(( SELECT  DISTINCT '],[' + ltrim(DCodes) 
                            FROM  @Dim 
                            ORDER BY '],[' + ltrim(DCodes)
                            FOR XML PATH('')

                                        ), 1, 2, '') + ']'

    EXECUTE ('SELECT ItemID, ItemName, Specifications, ' + @DCode + ' FROM #TempItems ORDER BY ItemName') 
END

DROP TABLE #TempItems
DROP TABLE #MasterTable

【问题讨论】:

    标签: sql sql-server sql-server-2005 view


    【解决方案1】:

    这是一个存储过程:不是视图。视图是单个 SELECT(可能带有 CTE 和 UNION)

    如果您需要从中选择,我建议您尝试multi-statement table valued function。但是,有一些限制可能会阻止这种情况。 YMMV。而且性能不是那么好

    【讨论】:

    • 是否可以使用表值函数获取动态表列?
    • @thevan:不知道,没试过。对于这种复杂性的代码,我会使用存储过程
    猜你喜欢
    • 2013-02-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多