2012-10-11 49 views
10

Chúng tôi đang tìm cách cập nhật một số cơ sở dữ liệu SQL Server để thay đổi tất cả giá trị NULL trong một bảng nhất định thành chuỗi rỗng thay vì NULL. Chúng tôi có khả năng sẽ làm điều này trên hàng trăm cơ sở dữ liệu. Tên bảng sẽ luôn giống nhau, nhưng các tên cột là biến dựa trên cách ứng dụng front-end được cấu hình (không phán xét ... Tôi đã không tạo ra hệ thống này).Tuyên bố cập nhật động với tên cột biến

Có cách nào để cập nhật tất cả các cột này mà không biết tên cột trước thời hạn không?

Trả lời

12

Bạn có thể vượt qua các tên của cột trong sql động:

declare @sql nvarchar (1000); 
set @sql = N'update table set ' + @column_name + '= '''''; 

exec sp_executesql @sql; 
+3

Vui lòng [luôn sử dụng 'quotename'] (http://stackoverflow.com/a/6285111/11683) xung quanh tên đối tượng động. – GSerg

+2

@GSerg +1 để đề cập đến 'quotename()'. Tôi sẽ nói rằng việc sử dụng nó ở đây có vẻ hơi thừa một chút vì điều này chỉ dành cho một số DML nội bộ. Nếu nó là một sproc được thực hiện với đầu vào của người dùng từ một trang web công khai (hoặc địa ngục, ngay cả nội bộ), tôi sẽ được tất cả trong. – CaptainMarvel

2

Bạn có thể tìm trong bảng sys.columns và tham gia vào tên bảng hoặc object_id.

DECLARE @OBJ_ID INT 

SELECT @OBJ_ID = OBJECT_ID 
FROM SYS.tables 
WHERE name = 'YOURTABLE' 

SELECT * FROM SYS.columns 
WHERE OBJECT_ID = @OBJ_ID 

Bạn có thể sử dụng trường name từ truy vấn sys.columns làm cơ sở để thực hiện cập nhật.

1

Giả sử bạn muốn tất cả các cột của chỉ các loại varchar/char (hoặc thay đổi bộ lọc loại để bất cứ điều gì bạn cần):

DECLARE @tableName varchar(10) 
SET @tableName = 'yourtablenamehere' 

DECLARE @sql VARCHAR(MAX) 
SET @sql = '' 

SELECT @sql = @sql + 'UPDATE ' + @tableName + ' SET ' + c.name + ' = '''' WHERE ' + c.name + ' IS NULL ;' 
FROM sys.columns c 
INNER JOIN sys.tables t ON c.object_id = t.object_id 
INNER JOIN sys.types y ON c.system_type_id = y.system_type_id 
WHERE t.name = @tableName AND y.name IN ('varchar', 'nvarchar', 'char', 'nchar') 

EXEC (@sql) 
Các vấn đề liên quan