2012-10-23 47 views
2

我的查詢返回26個表名。如何遍歷sql server中的每一行?

select name from sys.tables where name like '%JPro_VP_Service%' 

現在我試圖編寫一個查詢來檢查每個表返回從上面的查詢。

--consider this is my first table 
select * from JPro_VP_Service 
where row_id like '%1-101%' or row_id like '%1-102%' 
-- likewise I want to search in 26 tables return from above query  

我想我需要寫或光標來完成此操作。

任何人都可以幫助我如何實現這一目標?

+0

這聽起來像是你的數據模型可以使用一些重新設計。如果這些表中的數據相同,則應將其存儲在單個表中。 –

回答

1

要做到這一點,最簡單的方法是 試試這個:

SELECT 'select * from ' + name 
     + ' where row_id   like ''%1-101%'' or row_id like ''%1-102%''' 
FROM sys.tables 
WHERE name LIKE '%JPro_VP_Service%' 

您將獲得所有表格以及相同的條件。你可以一起執行它們。

0
DECLARE @mn INT 
DECLARE @mx INT 
DECLARE @tblname VARCHAR(100); 

WITH cte 
    AS (SELECT Row_number() 
        OVER ( 
        ORDER BY (SELECT 0)) AS rn, 
       name 
     FROM sys.tables 
     WHERE name LIKE '%JPro_VP_Service%') 
SELECT @mn = Min(rn), 
     @mx = Max(rn) 
FROM cte 

WHILE(@mn >= @mx) 
    BEGIN 
     SELECT @tblname = name 
     FROM cte 
     WHERE rn = @mn 

     SELECT * 
     FROM @tblname 
     WHERE row_id LIKE '%1-101%' 
       OR row_id LIKE '%1-102%' 

     --Do something else 
     SET @[email protected] + 1 
    END 
+0

代碼中存在一些錯誤 – Hanfeng

+0

這裏有什麼問題可以提到任何錯誤代碼? – AnandPhadke

+1

'cte'只能用在'SELECT * FROM @ mn = Min(rn),@ mx = Max(rn)FROM cte'這個語句中。在while循環中使用'cte'時,sql server會報告錯誤 – Hanfeng

0

這條路線可以工作,雖然你可能是想保存這些表中的結果:

DECLARE @tables TABLE(
ID INT IDENTITY(1,1), 
Name VARCHAR(100) 
) 

INSERT INTO @tables (Name) 
SELECT name 
FROM sys.tables 
WHERE name like '%JPro_VP_Service%' 

DECLARE @b INT = 1, @m INT, @table VARCHAR(100), @cmd NVARCHAR(MAX) 
SELECT @m = MAX(ID) FROM @tables 

WHILE @b <= @m 
BEGIN 

SELECT @table = Name FROM @tables WHERE ID = @b 

SET @cmd = 'select * from ' + @table + ' 
where row_id like ''%1-101%'' or row_id like ''%1-102%'' 
' 

EXECUTE sp_executesql @cmd 

SET @b = @b + 1 
SET @cmd = '' 

END