Non*_*ter 11 sql t-sql sql-server loops
我们有一个软件不会删除我们不再需要的条目.为了了解在我们的服务器中浪费了多少数据并准备进行大型清理操作,我试图遍历所有表并拉出标记为删除的记录.这就是我正在使用的:
DECLARE @total INT
DECLARE @count INT
DECLARE @name NVARCHAR(25)
DECLARE @rn INT
SET @total = (SELECT COUNT(Name) FROM sys.tables)
SET @count = 1
SET @rn = (SELECT ROW_NUMBER() OVER(ORDER BY Name) FROM sys.tables)   
WHILE @count <= @total AND @count < 2
    BEGIN
        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )
        EXEC('SELECT * FROM WS_Live.dbo.' + @name + ' WHERE GCRecord IS NOT NULL')
        SET @count += 1         
    END
这是我的错误:
消息116,级别16,状态1,行19当子查询未与EXISTS一起引入时,只能在选择列表中指定一个表达式.
我意识到我的错误可能与选择行中的两列有关
        SET @name = (   SELECT Name, ROW_NUMBER() OVER(ORDER BY Name)
                        FROM sys.tables 
                        WHERE @rn = @count
                     )
但是,我不确定如何确保我选择下一行.
PS AND @count <2仅用于脚本测试.
我怎样才能遍历所有表格?
Hit*_*004 22
使用此系统存储过程
sp_MSforeachtable @command1="select count(*) from ?"
注意:这sp_MSforeachtable是一个未记录的存储过程
Pரத*_*ீப் 11
也许这就是你要找的东西
DECLARE @NAME VARCHAR(100)
DECLARE @SQL NVARCHAR(300)
DECLARE CUR CURSOR FOR
  SELECT NAME
  FROM   SYS.TABLES
  WHERE  TYPE = 'U'
         AND SCHEMA_ID = 1
OPEN CUR
FETCH NEXT FROM CUR INTO @NAME
WHILE @@FETCH_STATUS = 0
  BEGIN
      SET @SQL = 'SELECT * FROM WS_LIVE.DBO.'+@NAME+' WHERE GCRECORD IS NOT NULL'
      PRINT @SQL
      EXEC Sp_executesql
        @SQL
      FETCH NEXT FROM CUR INTO @NAME
  END
CLOSE CUR
DEALLOCATE CUR 
有时在 SQL 中使用 Cursor 是有风险的。下面的 SQL 查询将遍历选定数据库中的所有表,而不使用 CURSOR。
USE TEST
Declare @TableName nvarchar(256) 
SET @TableName = ''
WHILE @TableName IS NOT NULL
BEGIN
    SET @TableName = 
    (
        SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME))
        FROM    INFORMATION_SCHEMA.TABLES
        WHERE       TABLE_TYPE = 'BASE TABLE'
            AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName
    )
print @TableName -- Your logic will come here
END
GO
上面的sql语句将打印TEST数据库中的所有表。因此,您可以提供自己的 sql 逻辑,而不是打印表语句,就像您想要循环每个表一样,@TableName将包含当前循环中的表名称。
| 归档时间: | 
 | 
| 查看次数: | 31472 次 | 
| 最近记录: |