2013-04-09 63 views
2

您好我有6個不同的表在sql服務器,我想運行下面的腳本。是否有可能在某種循環中做到這一點?爲許多表執行相同的SQL更新語句?

UPDATE Table 
    SET fk =CASE fk 
    WHEN 1 THEN 15 
    WHEN 2 THEN 16 
    WHEN 3 THEN 17 
    WHEN 4 THEN 11 
    WHEN 5 THEN 12 
    WHEN 6 THEN 13 
    WHEN 7 THEN 14 
    END 
    WHERE fk IN (1,2,3,4,5,6,7) 
    UPDATE Table SET fk = fk - 10 

回答

1

嘗試像下面..它會幫你...

通過逗號分隔您的表名稱...

DECLARE @test varchar(max); 
Declare @Count int; 
DECLARE @intFlag INT 
SET @intFlag = 1 
set @test = '#temp,#temp1,#temp2,#temp3'; --Table Names Separate by Commas 
set @test = Replace(@test, ',', '.') 
select @Count = len(@test) - len(replace(@test, '.', '')) 
WHILE (@intFlag <= @Count + 1) 
BEGIN 
Declare @tablename as varchar(100) 
Declare @sqlquery as varchar(5000) 
Select @tablename = ParseName(@test, @intFlag) 
SET @sqlquery = @sqlquery + 'UPDATE ' + @tablename 
SET @sqlquery = @sqlquery + 'SET fk = (CASE fk '  
SET @sqlquery = @sqlquery + 'WHEN 1 THEN 15 ' 
SET @sqlquery = @sqlquery + 'WHEN 2 THEN 16 ' 
SET @sqlquery = @sqlquery + 'WHEN 3 THEN 17 ' 
SET @sqlquery = @sqlquery + 'WHEN 4 THEN 11 ' 
SET @sqlquery = @sqlquery + 'WHEN 5 THEN 12 ' 
SET @sqlquery = @sqlquery + 'WHEN 6 THEN 13 ' 
SET @sqlquery = @sqlquery + 'WHEN 7 THEN 14 ' 
SET @sqlquery = @sqlquery + 'END) WHERE fk IN (1,2,3,4,5,6,7)  UPDATE ' + @tablename + ' SET fk = fk - 10' 
print @sqlquery 
exec(@sqlquery) 
SEt @intFlag = @intFlag + 1 
END 
0

沒有,除非你寫的,你必須手動或通過從sys.Tables


選擇TABEL名稱,將其從系統表的條件得到表名的光標這是不可能的

您需要使用動態sql,因爲NikolaMarkovinović在他的評論中提到過,所以您可以提供表名作爲參數,然後將其作爲表名處理。

,如:

CREATE PROCEDURE updTable @Tablename nvarchar(30) 
AS 
UPDATE @Tablename ... 
Your script here ... 
GO 

調用它像每個表:

EXEC updTable 'yourTableName' 

或者創建一個光標,其可以實現這個要求,如:

DECLARE @TableName VARCHAR(30) 
DECLARE db_cursor CURSOR FOR 
SELECT name 
FROM SYS.Tables 
WHERE name IN ('YourTable_1','YourTable_2' ... , 'YourTable_N') 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @name 
WHILE @@FETCH_STATUS = 0 
BEGIN 
    updTable @name  
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 
+0

我有表名,我不介意手動添加它們。你能否提供一個使用遊標完成的例子。 – Xerxes 2013-04-09 11:17:58

+0

我沒有測試過這段代碼,我希望它能正常工作,但你可能需要修改一下。 – CloudyMarble 2013-04-09 11:42:07

+0

不能用變量替換表名:'select * from @ table_name'是非法的(除非@table_name是表變量)。你需要訴諸[動態SQL](http://www.sommarskog.se/dynamic_sql.html)。 – 2013-04-09 11:48:45