2009-03-09 3 views
1

У меня около 100 сайтов, построенных в cms, каждый со своей собственной базой данных. Каждая база данных имеет одни и те же таблицы.Возможно ли передать имя db как параметр

Моя хранимая процедура должна выбрать все страницы в базе данных с учетом имени файла.

Ниже я пытаюсь передать имя базы данных в качестве параметра, но, похоже, она не работает.

... 
@site nvarchar(250) 

AS 

SELECT * 
FROM @site..cmsDocument 
WHERE published = 1 

Есть ли другой способ сделать это?

ответ

3
SELECT @dbname = quotename(dbname) 
SELECT @sql = ' SELECT ... FROM ' + @dbname + '.dbo.tablename WHERE ...' 
EXEC sp_executesql @sql, @params, ... 

Refs:

sp_executesql (Transact-SQL)

The Curse and Blessings of Dynamic SQL

+0

Использование динамического SQL с распределенной записью запросов - единственный способ, которым вы можете это сделать. –

1

Практически ни одна СУБД не позволяет вам использовать параметр таким образом. Создайте динамический запрос с помощью конкатенации и выполните его.

2

Вы можете указать базу данных в строке соединения:

Источник данных = myServerAddress; Начальный каталог = myDataBase; User Id = myUsername; Password = myPassword;

0

Вы можете использовать недокументированные хранимую процедуру sp_MSforeachdb: sp_MSforeachdb? SELECT * FROM .. table_name_here '

0

Если запрос/процедура выполняется из приложения .NET, вы можете также программно изменить базу данных объект соединения (VB.NET):

Using da As New SqlDataAdapter("SELECT * FROM cmsDocument WHERE published = 1", GetDatabaseConnection(ServerName)) 
    da.SelectCommand.Connection.ChangeDatabase("Foobar") 
End Using