如何迭代数据库中的表格,然后基于条件对这些表格行进行迭代?
问题描述:
我正在通过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
答
您需要设置所需的日期更新和条件检查到变量@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
可能的复制(http://*.com/questions/26496864/how-to-loop-through-all-sql-tables) – STLDeveloper