2013-11-20 56 views
0

通過sp_executesql執行一個動態SQL塊,其中@ Database1變量是存儲過程的參數。使用FROM子句中的參數動態SQL

SET @SQL = '' 
SET @SQL = 
'SELECT @@SERVERNAME, @DB, ''Schema name'', s.name, t.name, stype.Name, scol.length 
INTO ##TableList 
FROM '[email protected]+'.sys.tables t 

INNER JOIN '[email protected]+'.sys.schemas s 
    ON t.schema_id = s.schema_id' 

EXEC sp_executesql @SQL, N'@DB UNIQUEIDENTIFIER', @DB = @Database1 

但是我不確定如何在動態SQL的from子句中使用sp_executesql調用中的參數。有可能做到這一點,或者我應該考慮一種不同的方法?

+0

如果這只是一個測試或內部事物,或許可以考慮使用'sp_MSforeachtable'。這是無證的/可以在任何時候退休,但確實是你想要做的。 [Here's](http://blogs.msdn.com/b/chrissk/archive/2010/06/27/example-code-executing-tsql-for-each-table-in-a-database.aspx)示例。 – Bridge

回答

0

嘗試執行此過程:
不知道'Schema name'是什麼,所以我把它留下。嘗試改變它。

ALTER PROCEDURE [dbo].[Procedure] 

(
    @DB   VARCHAR(50) 
) 
AS 
DECLARE @SQL NVARCHAR(max); 

BEGIN 

CREATE TABLE #TableList(
       SERVERNAME NVARCHAR(255), 
       DB NVARCHAR(255), 
       Schema_name NVARCHAR(255), 
       s_name NVARCHAR(255), 
       t_name NVARCHAR(255), 
       stype_Name NVARCHAR(255), 
       scol_length INTEGER); 

    SET @SQL ='INSERT INTO #TableList(
          SERVERNAME, 
          DB, 
          Schema_name, 
          s_name, 
          t_name, 
          stype_Name, 
          scol_length) 
       SELECT  @@SERVERNAME, 
          @DB, 
          ''Schema name'', 
          s.name, 
          t.name, 
          stype.Name, 
          scol.length 
       FROM  [' + @DB + '].[sys].[tables] t 
       INNER JOIN [' + @DB + '].[sys].[schemas] s ON (t.schema_id = s.schema_id)' 

EXEC sp_executesql @SQL; 

SELECT SERVERNAME, 
     DB, 
     Schema_name, 
     s_name, 
     t_name, 
     stype_Name, 
     scol_length 
FROM #TableList 

END 
GO