2014-02-05 54 views
0

我有一個包含20個空間表(Zoom1-Zoom20)的列表,並在這些表中彈出時間無效的幾何圖形。當無效的幾何體發生我運行下面的語句來找出其中的無效幾何形狀:SQL Server存儲過程/光標

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 

變焦表,如果返回結果其上運行的變焦表更新語句?

回答

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  
' 
0

你有2層名爲的UDF和STIsValid MakeValid?如果是這樣,你可以做這樣的事情...

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 
+0

從SQL Server ** 2005 **開始,我建議使用更集中的'sys.tables'目錄視圖;首先,'sysobjects'已被棄用,不應該再使用,'sys.objects'確定,但要求你指定一個'type',這並不總是很直觀 - 至少我不會猜到「U」表...... –