7

我已经将以下代码放在一起,似乎工作得很好。但是,我需要将它放在存储过程中,但出现以下错误:

过程、函数或触发器中不允许使用 use 语句

有人知道解决方法吗?


CREATE TABLE #TableRowCounts1
(
      [TableName] VARCHAR(128), 
      [RowCount] INT
) 

CREATE TABLE #TableRowCounts2
(
      [TableName] VARCHAR(128), 
      [RowCount] INT
) 

use Database1
GO

INSERT INTO #TableRowCounts1
(
      [TableName], 
      [RowCount]
      )
EXEC sp_MSforeachtable 
      'SELECT ''?'' 
      [TableName], 
      COUNT(*) [RowCount] 
      FROM ?'

use Database2
GO

INSERT INTO #TableRowCounts2
(
      [TableName], 
      [RowCount]
      )
EXEC sp_MSforeachtable 
      'SELECT ''?'' 
      [TableName], 
      COUNT(*) [RowCount] 
      FROM ?'

4

2 回答 2

5

你应该把它改成那样工作。您需要使用要在不同数据库上运行的存储过程前面的数据库(和模式)来指定完全限定名称。

CREATE PROCEDURE SomeProc

AS

CREATE TABLE #TableRowCounts1
(
      [TableName] VARCHAR(128), 
      [RowCount] INT
) 

CREATE TABLE #TableRowCounts2
(
      [TableName] VARCHAR(128), 
      [RowCount] INT
) 

INSERT INTO #TableRowCounts1
(
      [TableName], 
      [RowCount]
      )
EXEC Database1.[dbo].sp_MSforeachtable 
      'SELECT ''?'' 
      [TableName], 
      COUNT(*) [RowCount] 
      FROM ?'

INSERT INTO #TableRowCounts2
(
      [TableName], 
      [RowCount]
      )
EXEC Database2.[dbo].sp_MSforeachtable 
      'SELECT ''?'' 
      [TableName], 
      COUNT(*) [RowCount] 
      FROM ?'
于 2013-10-14T00:53:50.790 回答
4

您可以简单地使用完全限定名称而不是使用 USE 语句,即

DATABASENAME.SCHEMANAME.TABLENAME.ColumnName
于 2013-10-14T00:51:37.273 回答