2012-02-06 29 views
9

Tôi đang sử dụng SQL Server 2008 và đang cố thay đổi tên cơ sở dữ liệu hiện tại thành một trong một biến. Tôi thường làm điều này một cách rõ ràng với statification USE myDatabaseName. Câu hỏi đặt ra là vì nếu tôi đang chạy tập lệnh và nếu tôi không thay đổi tên cơ sở dữ liệu, nó sẽ tạo tất cả các bảng trong cơ sở dữ liệu [master].Máy chủ SQL: Thay đổi cơ sở dữ liệu hiện tại qua biến

Tôi đã thử cách sau nhưng dường như không hoạt động vì nó tiếp tục áp dụng phần còn lại của mã create tables tới [master].

DECLARE @dbName CHAR(50) 
DECLARE @SqlQuery varchar(50) 
SET @dbName = 'MyNewDatabaseName' 

IF NOT EXISTS (SELECT * FROM sys.databases WHERE name = @dbName) 
BEGIN 
    SELECT @SqlQuery = 'CREATE DATABASE ' + @dbName + 'COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 
END 

Select @SqlQuery = 'Use ' + @dbName 
EXEC(@SqlQuery) 
go 
+0

bạn đang chạy tập lệnh như thế nào? –

+0

Là một 'truy vấn mới' ở cấp độ máy chủ. – Rick

Trả lời

12

Thực thi USE some_db trong SQL động không hoạt động nhưng rất tiếc khi phạm vi thoát khỏi bối cảnh cơ sở dữ liệu được thay đổi trở lại ban đầu.

Bạn có thể sử dụng chế độ sqlcmd cho điều này (bật tính năng này trên menu "Truy vấn" trong Management Studio).

:setvar dbname "MyNewDatabaseName" 

IF DB_ID('$(dbname)') IS NULL 
    BEGIN 

    DECLARE @SqlQuery NVARCHAR(1000); 
    SET @SqlQuery = N'CREATE DATABASE ' + QUOTENAME('$(dbname)') + ' 
      COLLATE SQL_Latin1_General_CP1_CI_AS' 
    EXEC(@SqlQuery) 

    END 

GO 

USE $(dbname) 

GO 
+0

+1 - Đây là chính xác (hoặc, tốt, rất gần) với những gì tôi đã trả lời. Nhưng bạn thực sự nhanh chóng :-) – Lamak

+0

Có thể thay đổi từ chế độ 'sqlcmd' sang SQL động trong cùng một truy vấn không? – Rick

+2

@Rick - Có chế độ 'sqlcmd' được bật không ngăn bạn sử dụng bất kỳ cấu trúc SQL nào. Các công cụ máy khách thực hiện thay thế biến trước khi lệnh được gửi đến SQL Server. –

0

Điều này có thể được thực hiện bằng phương tiện động sql. sử dụng một biến để lưu trữ dbname và sử dụng biến này để xây dựng một chuỗi sql như

SELECT @Sql ='SELECT fields FROM ' + @dbname +'.Table' 

sau đó sử dụng EXEC() hoặc sp_executesql để thực hiện chuỗi sql.

2

Chỉ cần thêm câu trả lời Martin Smith,

Nếu đây là để bạn có thể triển khai thành lập Bảng hoặc sửa đổi Bảng cho nhiều cơ sở dữ liệu bạn có thể tách các kịch bản cơ sở dữ liệu Creation và tạo đối tượng của bạn, và sau đó chạy chúng theo thứ tự sử dụng một tập tin bat bằng cách sử dụng input file -i. Điều này cho phép bạn thay đổi cơ sở dữ liệu giữa các script từ master đến cơ sở dữ liệu mới.

sau đó tập tin thực thi của bạn có thể

sqlcmd -S server\Instance -E -i createdatabase.sql 
sqlcmd -S server\Instance -E -d MyNewDatabaseName -i CreateTables.sql 

thường tuy nhiên tôi đã chỉ cần thiết để thực hiện điều này khi tôi đã triển khai thay đổi cho nhiều cơ sở dữ liệu (đừng hỏi tại sao) ví dụ

sqlcmd -S server\Instance -E -d OneDatabase -i CreateTables.sql 
sqlcmd -S server\Instance -E -d AnotherDatabase -i CreateTables.sql 
Các vấn đề liên quan