如何使用 SQL Server 2005 创建基于 SQL 语句集的视图?
Posted
技术标签:
【中文标题】如何使用 SQL Server 2005 创建基于 SQL 语句集的视图?【英文标题】:How to Create View based on the Set of SQL Statements using SQL Server 2005? 【发布时间】: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
【问题讨论】:
【参考方案1】:这是一个存储过程:不是视图。视图是单个 SELECT(可能带有 CTE 和 UNION)
如果您需要从中选择,我建议您尝试multi-statement table valued function。但是,有一些限制可能会阻止这种情况。 YMMV。而且性能不是那么好
【讨论】:
是否可以使用表值函数获取动态表列? @thevan:不知道,没试过。对于这种复杂性的代码,我会使用存储过程以上是关于如何使用 SQL Server 2005 创建基于 SQL 语句集的视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 SQL Server 2005 中进行更新插入(更新或插入)
将使用 SQL Server Express 2008 创建的 mdf 导入 SQL Server 2005 时出现问题
如何生成将使用数据重建我的 MS SQL Server 2005 数据库的脚本?
在sql server 2005中使用表数据创建脚本文件[重复]