2015-08-28 68 views
-2

我想編寫一個sql腳本: 找到所有具有名爲列的表:姐妹 然後,在列中添加這些表中的所有行姐妹那裏有什麼+ *如何通過表名更改表格

例如 族表:

brother sister mother 
m  b  c 
k   r  p 

結果將是表改爲

brother sister mother 
m  b*  c 
k   r*  p 

如果有更多的表與姊妹欄它應該這樣做給他們。 如果有更多的table withous siter列,它不應該觸摸它們。

感謝很多幫助

+1

他們想添加一個星號每次是在一個名爲列值的結尾姐姐在任何表中......'更新表集姐姐=姐姐'''''但它聽起來像他想動態地爲所有有姐妹列的表執行此動作 – JamieD77

+1

如果該值已經以'*'結尾了怎麼辦?如果該值已經處於最大列長度並且沒有空間來追加額外字符會怎麼樣? –

+0

@MartinSmith所以如果它還必須添加,但如果你不能因爲max或其他東西而不能使用 –

回答

0

試試這個,

SELECT 'UPDATE ' + TABLE_NAME + ' SET ' + COLUMN_NAME 
     + '= ' + COLUMN_NAME + '+''*''' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE COLUMN_NAME = 'YOUR_COLUMN_NAME' 
     AND TABLE_SCHEMA = 'YOUR_SCHEMA_NAME' 
+0

這是不可執行的@paul –

0

儘可能靠近我可以告訴你需要使用動態SQL來實現這一目標。我不推薦。最好知道你正在更新哪些表,而不是依靠數據庫來知道。可能有一個表您不想更新。

但是;下面的代碼將完成您在所有表上查找名爲「sister」的所有列的請求,並將星號附加到存儲在那裏的值的末尾。我不使用遊標。我創建UPDATE語句作爲單個事務。

-- Table variable to hold update statments: 
declare @sqlUpdates table (
          ID int   not null identity(1,1) 
         , stmt nvarchar(max) not null 
         ); 

-- Populate all the update statements at once: 
insert @sqlUpdates (stmt) 
select 'update [' 
    + schema_name(tables.schema_id) 
    + '].[' 
    + tables.name 
    + '] set sister = sister + ''*''' 
    from sys.tables 
    join sys.columns 
    on columns.object_id = tables.object_id 
where columns.name = 'sister' 

-- Loop throug & execute update statement 
declare @min int = (select min(ID) from @sqlUpdates); 
declare @stmt nvarchar(max); 

while @min is not null 
begin; 

    -- Get the update statement from the table variable 
    set @stmt = (select stmt from @sqlUpdates where ID = @min); 

    -- execute the update: 
    exec sp_executesql @stmt = @stmt; 

    -- Increment the loop: 
    set @min = (select min(ID) from @sqlUpdates where ID > @min) 

end; 
0

萬一你在一個地方需要另一種選擇與靈活更改列名的:

DECLARE @ColumnName VARCHAR(100) = 'sister' 
DECLARE @TableName VARCHAR(200) 
DECLARE @SQL VARCHAR(8000) 

DECLARE cur CURSOR FOR 
    SELECT '['+C.TABLE_SCHEMA+'].['+C.TABLE_NAME+']' FROM INFORMATION_SCHEMA.COLUMNS C 
    INNER JOIN INFORMATION_SCHEMA.TABLES T ON C.TABLE_NAME = T.TABLE_NAME 
    WHERE C.COLUMN_NAME LIKE @ColumnName 
    AND TABLE_TYPE = 'BASE TABLE' 

OPEN cur 
FETCH NEXT FROM cur INTO @TableName 

WHILE @@FETCH_STATUS = 0 
BEGIN 

    SET @SQL = 'UPDATE ' + @TableName + ' SET '+ @ColumnName +' = '+ @ColumnName + ' + ''*''' 

    EXEC sp_executesql @SQL; 

    FETCH NEXT FROM cur INTO @TableName 
END 

CLOSE cur; 
DEALLOCATE cur; 
+0

一般來說,你應該避免遊標。您應該包含符合模式限定的表名稱(可能有多個同名的表)。您應該設置(但不聲明)循環內的變量。使用sp_executesql而不是EXEC @SQL。 –

+0

感謝您的信息:) – CoOl