views:

399

answers:

4

I have about 100 sites built in a cms, each with its own database. Each database has the same tables.

My stored procedure needs to select all of the pages in a database given a sitename.

Below I am trying to pass the database name as a parameter, but it doesn't seem to work.

...
@site nvarchar(250)

AS

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

Is there some other way to do this?

+1  A: 

Almost no DBMSes allow you to use a parameter in this manner. Build a dynamic query via concatenation and execute it.

Ignacio Vazquez-Abrams
+2  A: 
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

Mitch Wheat
Using dynamic SQL with distributed query notation is the only way you can do it.
Jonathan Leffler
+1  A: 

You can specify the database in the connection string:

Data Source=myServerAddress;Initial Catalog=myDataBase;User Id=myUsername;Password=myPassword;

Guffa
A: 

You can use the undocumented stored procedure sp_MSforeachdb: sp_MSforeachdb 'SELECT * FROM ?..table_name_here'