【问题标题】:a use statement is not allowed in a procedure, function or trigger过程、函数或触发器中不允许使用 use 语句
【发布时间】:2013-10-14 00:47:37
【问题描述】:

我整理了以下代码,看起来运行良好。但是,我需要将它放在存储过程中,但出现以下错误:

过程、函数或触发器中不允许使用 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 ?'

【问题讨论】:

    标签: sql sql-server stored-procedures


    【解决方案1】:

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

    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 ?'
    

    【讨论】:

    • 噢!完全错过了。谢谢。
    【解决方案2】:

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

    DATABASENAME.SCHEMANAME.TABLENAME.ColumnName
    

    【讨论】:

      猜你喜欢
      • 2012-10-22
      • 1970-01-01
      • 2019-09-26
      • 1970-01-01
      • 2017-09-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多