2015-08-28 66 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