如何遍历数据库中的表,然后根据条件遍历这些表行?
How do I iterate through tables in a database then those tables rows based on a condition?
我正在处理 AdventureWorks2008R2 数据库,我试图弄清楚是否有一种方法可以遍历该数据库中的所有 table,然后给定一个条件来遍历其中的行table 的特定列?
目前我有
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%'
;
从这里开始,我想做的是浏览这些 table,然后根据给定条件更改它们的行。
在非 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
有人可以帮忙吗?
提前致谢!
更新
这是我根据@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<=@end)
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 =@start
EXEC (@query)
SET @start+=1
END
DROP TABLE #temptable
您需要设置更新所需的日期和检查变量 @updatatingDate
和 @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<=@end)
BEGIN
SELECT
@query= 'UPDATE '+TABLE_SCHEMA+'.'
+TABLE_NAME +' SET '+ COLUMN_NAME
+' ='''+@updatatingDate+''' WHERE '
+@conditions
FROM #temptable
WHERE SN =@start
EXEC (@query)
SET @start+=1
END
--DROP TABLE #temptable;
我正在处理 AdventureWorks2008R2 数据库,我试图弄清楚是否有一种方法可以遍历该数据库中的所有 table,然后给定一个条件来遍历其中的行table 的特定列?
目前我有
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%'
;
从这里开始,我想做的是浏览这些 table,然后根据给定条件更改它们的行。
在非 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
有人可以帮忙吗?
提前致谢!
更新
这是我根据@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<=@end)
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 =@start
EXEC (@query)
SET @start+=1
END
DROP TABLE #temptable
您需要设置更新所需的日期和检查变量 @updatatingDate
和 @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<=@end)
BEGIN
SELECT
@query= 'UPDATE '+TABLE_SCHEMA+'.'
+TABLE_NAME +' SET '+ COLUMN_NAME
+' ='''+@updatatingDate+''' WHERE '
+@conditions
FROM #temptable
WHERE SN =@start
EXEC (@query)
SET @start+=1
END
--DROP TABLE #temptable;