2017-04-03 55 views
1

我正在通過AdventureWorks2008R2數據庫工作,並試圖找出是否有一種方法來遍歷此數據庫中的所有表,然後給出一個條件遍歷該表的特定列中的行?如何迭代數據庫中的表格,然後基於條件對這些表格行進行迭代?

目前我有

SELECT DISTINCT 
INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION,TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE ('%date%') AND COLUMN_NAME Not LIKE '%JobCandidate%' 
; 

我想什麼從這裏做的就是去通過這些表,然後他們行改變基於給定條件的日期。

在非SQL代碼和適度寬鬆的僞它可能是這樣的

FOR TABLES 
SELECT A TABLE WITH A COLUMN THAT HAS A DATE IN IT 
FOR COLUMN_WITH_DATE_HEADER 
IF ROW HAS DATE GIVEN SOME CONDITION 
UPDATE ROW IN THAT TABLE 

任何人都可以幫助嗎?

在此先感謝!

UPDATE

這裏是我創建從@Mars解決方案適應它的代碼。

SELECT DISTINCT 
IDENTITY(int,1,1) AS SN, 
INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION 
, TABLE_SCHEMA 
, TABLE_NAME 
, COLUMN_NAME 
INTO #temptable 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE ('%date%') 
AND COLUMN_NAME Not LIKE '%JobCandidate%' AND 
COLUMN_NAME NOT LIKE '%BirthDate%'; 

    DECLARE @start INT=1 
, @end INT=0 
, @query NVARCHAR(MAX)=''; 
DECLARE @conditions NVARCHAR(MAX)='' ; 


SELECT @end=MAX(SN) 
FROM #temptable 
WHILE (@start<[email protected]) 
BEGIN 
    SELECT 
    @conditions = ' WHERE ' + 'YEAR('+ COLUMN_NAME +')' + ' < 2009', 
    @query= 'UPDATE '+TABLE_SCHEMA+'.' 
      +TABLE_NAME +' SET '+ COLUMN_NAME 
      +' = dateadd(YEAR,8,' + COLUMN_NAME + ')'  
    FROM #temptable 
    WHERE SN [email protected] 
    EXEC (@query) 
    SET @start+=1 
END 

DROP TABLE #temptable 
+0

可能的複製(http://stackoverflow.com/questions/26496864/how-to-loop-through-all-sql-tables) – STLDeveloper

回答

1

您需要設置所需的日期更新和條件檢查到變量@updatatingDate和[通過所有SQL表如何循環]的@conditions

SELECT DISTINCT 
IDENTITY(int,1,1) AS SN, 
INFORMATION_SCHEMA.COLUMNS.ORDINAL_POSITION 
, TABLE_SCHEMA 
, TABLE_NAME 
, COLUMN_NAME 
INTO #temptable 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME LIKE ('%date%') 
AND COLUMN_NAME Not LIKE '%JobCandidate%'; 

    DECLARE @start INT=1 
, @end INT=0 
, @query NVARCHAR(MAX)='' 
, @updatatingDate NVARCHAR(100)='2017-04-04' 
, @conditions NVARCHAR(MAX)='1=1' 

SELECT @end=MAX(SN) 
FROM #temptable 
WHILE (@start<[email protected]) 
BEGIN 
    SELECT 
    @query= 'UPDATE '+TABLE_SCHEMA+'.' 
      +TABLE_NAME +' SET '+ COLUMN_NAME 
      +' ='''[email protected]+''' WHERE ' 
      [email protected] 
    FROM #temptable 
    WHERE SN [email protected] 
    EXEC (@query) 
    SET @start+=1 
END 
--DROP TABLE #temptable; 
+0

您好Mars,感謝您的解答。過去幾天我一直在用它來了解你所做的事情,這正是我所期待的。這是一個很好的方法,我很欣賞能夠根據需要修改它,以便進行更復雜的迭代查詢。非常感謝! – user2023068