Just like the leading answer but without SQL injection vulnerability.
First you must query the sys.databases in order to be sure to get the real Database name while not counting on the users text:
SELECT @Database = [name]
FROM sys.databases
WHERE [name] = @Database;
Now perform the query using sp_executesql:
DECLARE @Query nvarchar(200);
SET @Query = N'SELECT * FROM ' + @DBName + '.dbo.sample';
EXEC sp_executesql @Query
Full Stored procedure:
CREATE PROCEDURE [MyScheme].[MyStoredProcedure]
(
@DBName sysname
)
AS
BEGIN
SET NOCOUNT ON;
SELECT @DBName = [name]
FROM sys.databases
WHERE [name] = @DBName;
DECLARE @Query nvarchar(200);
SET @Query = N'SELECT * FROM ' + @DBName + '.dbo.sample';
EXEC sp_executesql @Query
END
GO
Or even a simpler version using QUOTENAME(...) to prevent SQL injection.
CREATE PROCEDURE [MyScheme].[MyStoredProcedure]
(
@DBName sysname
)
AS
BEGIN
DECLARE @Query nvarchar(max);
SET @Query = N'SELECT * FROM ' + QUOTENAME(@DBName) + '.dbo.sample';
EXEC sp_executesql @Query
END
GO