Tạo View trong cơ sở dữ liệu được chỉ định với sql động?


16

Tôi đang viết một sql động để thả và tạo chế độ xem trong cơ sở dữ liệu khác nhau.

Vì vậy, tôi đã viết:

set @CreateViewStatement = 
                '
                USE ['+ @DB +'];
                CREATE VIEW [dbo].[MyTable]
                AS

                SELECT ........something
exec (@CreateViewStatement)

Nó cho tôi lỗi:

'TẠO XEM' phải là câu lệnh đầu tiên trong một đợt truy vấn.

Nếu tôi loại bỏ câu lệnh USE DATABASE thì nó hoạt động tốt, nhưng sau đó cơ sở dữ liệu không được chỉ định nữa ....

Làm thế nào tôi có thể giải quyết vấn đề này?

Câu trả lời:


25

Bạn có thể sử dụng các EXECcuộc gọi lồng nhau . Bối cảnh cơ sở dữ liệu được thay đổi bởi các nhóm USEvẫn tồn tại.

DECLARE @DB SYSNAME

SET @DB = 'tempdb'

DECLARE @CreateViewStatement NVARCHAR(MAX) 
SET @CreateViewStatement = '
      USE '+ QUOTENAME(@DB) +';
      EXEC(''
             CREATE VIEW [dbo].[MyTable] AS
             SELECT 1 AS [Foo]
      '')

                          '
EXEC (@CreateViewStatement)

1
+1 - Nếu bạn loại bỏ các khung nhìn bằng SMO, đây là cách khung cũng thực hiện - các định nghĩa được thực thi trong SQL động để khắc phục hạn chế
JNK

1
@KingChan - bạn có thể vừa nâng cấp vừa chấp nhận, FYI;)
JNK

@JNK +1 tất nhiên ~ :)
King Chan

chắc chắn đã làm việc !! mặc dù tôi đã sử dụng nó, với nhiều biến trong truy vấn lồng nhau, vì vậy tôi rất đau đầu trong việc xử lý trích dẫn! giải pháp tuyệt vời mặc dù!

Bạn là một anh hùng. Sẽ đặt tên con đầu lòng của tôi theo bạn.
Jens

-1

Một cách tôi đã xử lý khi gặp trường hợp này là đặt GO sau khi sử dụng câu lệnh.

set @CreateViewStatement = 
'
  USE ['+ @DB +']; GO
  CREATE VIEW [dbo].[MyTable]
  AS

  SELECT ........something'
exec (@CreateViewStatement)

Chỉ để bạn biết, thống kê GO sẽ không chạy trong exec
King Chan

2
Điều này sẽ không hoạt động trong bối cảnh SQL động. GOlà một dấu phân cách hàng loạt trong các công cụ máy khách không phải là từ khóa TSQL.
Martin Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.