【问题标题】:SQL Server stored procedure/cursorSQL Server 存储过程/游标
【发布时间】:2014-02-05 20:56:42
【问题描述】:

我有一个包含 20 个空间表 (Zoom1-Zoom20) 的列表,并且有时会在这些表中弹出无效的几何图形。当出现无效几何时,我运行以下语句来查找无效几何的位置:

SELECT ID FROM Zoom10 WhERE Location.STIsValid() = 0

通常我必须为每个缩放表运行上述语句(导致无效几何图形的错误并不指示哪个缩放表具有无效几何图形),当从 select 语句返回结果时,我运行以下语句修正几何:

UPDATE MGeoZoom10 set Location = Location.MakeValid() where Location.STIsValid() = 0

我的问题是这个过程是否可以通过获取缩放表列表的存储过程自动化

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

然后使用

循环浏览缩放表
SELECT ID FROM Zoom10 WhERE Location.STIsValid() = 0

如果返回结果,它会在缩放表上运行更新语句?

【问题讨论】:

    标签: sql sql-server tsql


    【解决方案1】:

    试试这个:

    sp_msforeachtable '
    if ''?'' Like ''%Zoom%'' 
        Begin
            If Exists(SELECT ID FROM ? WhERE Location.STIsValid() = 0)
                UPDATE ? set Location = Location.MakeValid() where Location.STIsValid() = 0
        End     
    '
    

    【讨论】:

      【解决方案2】:

      您是否有 2 个名为 STIValid 和 MakeValid 的 UDF?如果是这样,你可以做这样的事情......

          SELECT id INTO #Processed FROM Sysobjects WHERE name = '(no such table)'
      
          DECLARE @TableId int, @TableName varchar(255), @CorrectionSQL varchar(255)
      
          SELECT @TableId = MIN(id) FROM Sysobjects WHERE type = 'U' AND name LIKE '%zoom'
          AND id NOT IN (SELECT id FROM #Processed)
      
          SET @TableId = ISNULL(@TableId, -1)
      
          WHILE @TableId > -1 BEGIN
      
              PRINT @TableId
      
              SELECT @TableName = name FROM Sysobjects WHERE type = 'U' AND id = @TableId
              SET @CorrectionSQL = 'UPDATE ' + @TableName + ' SET Location = dbo.MakeValid(Location) where dbo.STIsValid(Location) = 0'
      
              PRINT @CorrectionSQL
              EXEC(@CorrectionSQL)
      
      
              INSERT INTO #Processed (id) VALUES(@TableId)
      
              SELECT @TableId = MIN(id) FROM Sysobjects WHERE type = 'U' AND name IN ('DimAccount', 'DimCurrency', 'DimCustomer')
                  AND id NOT IN (SELECT id FROM #Processed)
      
          END
      

      【讨论】:

      • 从 SQL Server 2005 开始,我建议使用更集中的 sys.tables 目录视图;首先,sysobjects 已弃用,不应再使用,sys.objects 可以,但需要您指定一个 type,这并不总是很直观——至少我不会猜到 @987654326 @ 表......
      猜你喜欢
      • 1970-01-01
      • 2015-07-03
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多