我正在嘗試從我的資料庫AdventureWorksDW2019中的每個表回傳所有表結果。我目前的方法會以某種方式起作用嗎?還是有更簡單/有效的方法來做到這一點?在我目前的方法中,當按升序名稱排序時,我將所有表名及其各自的行號存盤在一個臨時表中。然后,我試圖將其包裝在 WHILE 陳述句中以回圈遍歷每個表并從每個表中選擇所有結果。任何建議將不勝感激!
DROP TABLE IF EXISTS #TableNamesSorted
SELECT
name,
RowNum = ROW_NUMBER() OVER(ORDER BY name)
INTO #TableNamesSorted
FROM
SYSOBJECTS
WHERE
xtype = 'U'
DECLARE @i INT = 0;
DECLARE @currentTableName varchar(25);
WHILE @i < (SELECT COUNT(*) FROM #TableNamesSorted)
BEGIN
SET @i = @i 1
SET @currentTableName = (SELECT name from #TableNamesSorted WHERE RowNum = @i)
SELECT * FROM (SELECT @currentTableName)
END
uj5u.com熱心網友回復:
當不需要回圈時,我絕對討厭回圈,這是其中之一。您可以輕松地生成一個字串,并從每個表中選擇前 10 個。請注意,這也將處理模式,如果您有多個模式,您的解決方案將失敗。我還將表的名稱作為第一列包含在內,這樣您就知道要查看樣本資料的表。就是這么簡單,沒有臨時表,沒有回圈。
declare @sql nvarchar(max) = ''
select @sql = 'select top 10 TableName = ''' QUOTENAME(s.name) '.' QUOTENAME(t.name) ''', * from ' QUOTENAME(s.name) '.' QUOTENAME(t.name) ';'
from sys.tables t
join sys.schemas s on s.schema_id = t.schema_id
exec sp_executesql @sql
uj5u.com熱心網友回復:
雖然可能有更好的方法來解決這個問題(謝謝 Dai 和 SMor),
我使用它來作業:
IF OBJECT_ID('tempdb.#TableNamesSorted') IS NULL DROP TABLE #TableNamesSorted
SELECT
name,
RowNum = ROW_NUMBER() OVER(ORDER BY name)
INTO #TableNamesSorted
FROM
SYSOBJECTS
WHERE
xtype = 'U'
DECLARE @i INT = 0;
DECLARE @currentTableName varchar(25);
DECLARE @SQL nvarchar(1000)
DECLARE @TableCount INT = (SELECT COUNT(*) FROM #TableNamesSorted)
WHILE @i <= @TableCount
BEGIN TRY
SET @i = @i 1
SET @currentTableName = (SELECT name from #TableNamesSorted WHERE RowNum = @i)
SET @SQL = CONCAT('SELECT TOP 10 * FROM ', @currentTableName)
EXEC (@SQL)
END TRY
BEGIN CATCH
Print 'Errors on ' @currentTableName
END CATCH;
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/492708.html
上一篇:許多表通過回圈功能聯合
