Có cách nào để tạo tập lệnh tạo từ một bảng hiện có hoàn toàn trong T-SQL (nghĩa là không sử dụng SMO, vì T-SQL không có quyền truy cập vào SMO). Giả sử một thủ tục được lưu trữ nhận tên bảng và trả về một chuỗi chứa tập lệnh tạo cho bảng đã cho?
Bây giờ hãy để tôi mô tả tình huống tôi đang gặp phải, vì có thể có một cách khác để tiếp cận vấn đề này. Tôi có một ví dụ với vài chục cơ sở dữ liệu. Các cơ sở dữ liệu này đều có cùng một lược đồ, tất cả các bảng, chỉ mục giống nhau. Chúng được tạo ra như là một phần của cài đặt phần mềm của bên thứ ba. Tôi cần có cách làm việc với họ để tôi có thể tổng hợp dữ liệu từ họ theo cách đặc biệt. Những người tốt bụng tại dba.se đã giúp tôi ở đây Làm thế nào để tạo một kích hoạt trong cơ sở dữ liệu khác nhau?
Hiện tại tôi cần tìm một cách để chọn từ một bảng trên tất cả các cơ sở dữ liệu. Tôi đã ghi lại tất cả các tên cơ sở dữ liệu vào một bảng được gọi Databasees
và tôi đã viết đoạn mã sau để thực thi một câu lệnh chọn trên tất cả chúng:
IF OBJECT_ID('tempdb..#tmp') IS NOT NULL
DROP TABLE #tmp
select * into #tmp from Database1.dbo.Table1 where 1=0
DECLARE @statement nvarchar(max) =
N'insert into #tmp select * from Table1 where Column1=0 and Cloumn2 =1'
DECLARE @LastDatabaseID INT
SET @LastDatabaseID = 0
DECLARE @DatabaseNameToHandle varchar(60)
DECLARE @DatabaseIDToHandle int
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
WHILE @DatabaseIDToHandle IS NOT NULL
BEGIN
DECLARE @sql NVARCHAR(MAX) = QUOTENAME(@DatabaseNameToHandle) + '.dbo.sp_executesql'
EXEC @sql @statement
SET @LastDatabaseID = @DatabaseIDToHandle
SET @DatabaseIDToHandle = NULL
SELECT TOP 1 @DatabaseNameToHandle = Name,
@DatabaseIDToHandle = Database_Ref_No
FROM Databasees
WHERE Database_Ref_No > @LastDatabaseID
ORDER BY Database_Ref_No
END
select * from #tmp
DROP TABLE #tmp
Tuy nhiên, đoạn script trên không thành công với thông báo sau:
Giá trị rõ ràng cho cột danh tính trong bảng '#tmp' chỉ có thể được chỉ định khi danh sách cột được sử dụng và IDENTITY_INSERT được BẬT.
Thêm điều này:
SET IDENTITY_INSERT #tmp ON
vì không giúp được gì, vì tôi không thể chỉ định danh sách cột và giữ nó chung chung.
Trong SQL, không có cách nào để tắt danh tính trên một bảng đã cho. Bạn chỉ có thể thả một cột và thêm một cột, điều này rõ ràng sẽ thay đổi thứ tự cột. Và nếu thứ tự cột thay đổi, bạn, một lần nữa, cần chỉ định danh sách cột, sẽ khác nhau tùy thuộc vào bảng bạn truy vấn.
Vì vậy, tôi đã suy nghĩ nếu tôi có thể lấy đoạn mã tạo bảng trong mã T-SQL của mình, tôi có thể thao tác nó với các biểu thức thao tác chuỗi để xóa cột định danh và cũng thêm một cột cho tên Cơ sở dữ liệu vào tập kết quả.
Bất cứ ai cũng có thể nghĩ ra một cách tương đối dễ dàng để đạt được những gì tôi muốn?