0
A
回答
1
這應該對當前數據庫有用。它仍然是動態SQL,但是...請注意,它不檢查視圖是否已經存在。您可以將光標查詢添加WHERE
子句以限制表格 - WHERE t.name = '...'
或WHERE t.name IN ('...','....')
。
DECLARE @TableName sysname
DECLARE @ColumnCount INT
DECLARE @ColumnID INT
DECLARE @SelectColumn NVARCHAR(500)
DECLARE @sql NVARCHAR(max) = ''
DECLARE QUERYINFO CURSOR FOR
SELECT
t.name AS TableName,
ccount.ColumnCount,
c.column_id AS ColumnID,
CASE WHEN c.column_id <> ccount.ColumnCount
THEN c.name + ', '
ELSE c.name
END AS SelectColumn
FROM sys.tables t
INNER JOIN sys.columns c ON t.object_id=c.object_id
INNER JOIN (
SELECT object_id,COUNT(*) AS ColumnCount
FROM sys.columns
GROUP BY object_id
) ccount ON t.object_id = ccount.object_id
ORDER BY t.Name,c.column_id
OPEN QUERYINFO
FETCH NEXT FROM QUERYINFO INTO @TableName,@ColumnCount,@ColumnID,@SelectColumn
WHILE @@FETCH_STATUS = 0
BEGIN
IF @ColumnID = 1
BEGIN
SET @sql = 'CREATE VIEW v_' + @TableName + ' AS SELECT ' + @SelectColumn
END
ELSE
BEGIN
SET @sql = @sql + @SelectColumn
END
IF @ColumnID = @ColumnCount
BEGIN
SET @sql = @sql + ' FROM ' + @TableName
EXEC sys.sp_executesql @sql
SET @sql = ''
END
FETCH NEXT FROM QUERYINFO INTO @TableName,@ColumnCount,@ColumnID,@SelectColumn
END
CLOSE QUERYINFO
DEALLOCATE QUERYINFO
+0
只需謹慎一點 - 子句IF \ @ColumnID = \ @ColumnCount可能無法按預期工作,因爲ColumnID可能不是按順序的 - 即在刪除列(除最後一列之外)後,ID不會重新編號。 – Rashack
0
我知道這是一個有點過時,但你可以使用一個臨時表遞歸CTE串起來,從SYS.COLUMNS和SYS.TABLES列,然後生成視圖不使用過程或遊標。這是一個例子。這個只會選擇一個object_id,但是你可以爲你的db中的所有表運行它。唯一的問題可能是如果你有一個大於100列的表。我認爲CTE的默認深度是100個遞歸連接。
SELECT t.name AS TableName
, ccount.ROW_COUNT
, c.column_id AS ROW_RANK
, c.name as COL
INTO #VT_TEMP
FROM sys.tables t INNER JOIN sys.columns c
ON t.object_id=c.object_id
INNER JOIN ( SELECT object_id
, COUNT(*) AS ROW_COUNT
FROM sys.columns
GROUP BY object_id
) ccount
ON t.object_id = ccount.object_id
WHERE t.OBJECT_ID = 245575913
ORDER BY t.Name, c.COLUMN_ID
;
WITH MYVIEW_CTE (T_NAME, R_COUNT, R_RANK, TXT)
AS
(
SELECT TABLENAME
, ROW_COUNT
, ROW_RANK
, CAST(COL AS VARCHAR(MAX))
FROM #VT_TEMP
WHERE ROW_RANK = 1
UNION ALL
SELECT V.TABLENAME
, V.ROW_COUNT
, V.ROW_RANK
, CAST(TXT + ', ' + V.COL AS VARCHAR(MAX))
FROM #VT_TEMP V INNER JOIN MYVIEW_CTE C
ON V.TABLENAME = T_NAME
AND V.ROW_RANK = R_RANK + 1
)
SELECT CC.T_NAME
,CC.TXT
, 'CREATE VIEW V_' + CC.T_NAME + ' AS SELECT ' + CC.TXT + ' FROM dbo.' + CC.T_NAME + ' ;' as DDL_View
FROM MYVIEW_CTE CC INNER JOIN (
SELECT T_NAME, MAX(R_RANK) AS MX_CNT
FROM MYVIEW_CTE C
GROUP BY T_NAME
) SC
ON CC.T_NAME = SC.T_NAME
AND CC.R_RANK = SC.MX_CNT
相關問題
- 1. 動態創建視圖表
- 2. 如何爲android 2.2或2.3創建自定義堆棧視圖
- 3. Android - 如何自動創建視圖?
- 4. 清理自動創建視圖模型
- 5. 創建自定義列表視圖
- 6. 創建堆疊的圖像視差
- 7. 創建一個自定義視圖組
- 8. 創建視圖或表或創建一個條目來自動生成另一個表中的行?
- 9. 動態創建列表視圖
- 10. 創建自定義視圖
- 11. 創建自定義視圖
- 12. 創建自定義視圖
- 13. 創建自定義視圖?
- 14. 創建自定義視圖
- 15. iOS爲視圖創建動畫模糊
- 16. 如何爲UIImageview創建一個堆棧並將其上的圖像視圖
- 17. 創建一個全向滾動視圖
- 18. 爲部分視圖列表創建RazorPDF
- 19. 自動創建帶有錨標籤的列表視圖項目
- 20. 很難在列表視圖(WPF)中創建自動排序
- 21. 如何在自定義視圖中爲Drawable創建動畫?
- 22. 如何爲自定義視圖創建縮放動畫效果
- 23. 創建Xml vs動態創建視圖
- 24. 如何在swift中創建動態堆棧視圖?
- 25. Ember.js - 創建一個「表格」視圖
- 26. 從視圖創建一個表格?
- 27. 創建一個3表的視圖
- 28. 在創建列表視圖活動之前預創建行視圖?
- 29. 爲Spotify播放列表創建自定義視圖
- 30. 爲列表視圖設置dispatchTouchEvent而不創建自定義列表視圖類。 (用於禁用滾動)
你到目前爲止試過了什麼?您可以查詢[sys.tables](http://msdn.microsoft.com/en-us/library/ms187406(v = sql.100).aspx)和[sys.columns](http://msdn.microsoft .com/en-us/library/ms176106(v = sql.100).aspx)來獲取你需要的名字;這有幫助嗎? – Pondlife
是的。我看看這個創建的動態SQL來創建視圖。希望有一個更「優雅」的解決方案! – Nico
「優雅」是什麼意思?無論您選擇哪種解決方案,您都需要檢索表名和列名,並構建「CREATE VIEW」語句。所以唯一的問題是,你是使用TSQL還是使用外部代碼(可能使用SMO)? – Pondlife