如何在过程中使用数据库名称

时间:2011-10-06 18:05:31

标签: sql-server tsql sql-server-2008 stored-procedures

我创建了一个过程,它将为给定的表名输出INSERT脚本。在我使用此代码的过程中:

DECLARE @owner VARCHAR(20) ,
    @Database VARCHAR(50)

SELECT  @owner = 'dbo' ,
        @Database = 'Asmin'

 SELECT   sc.name
   FROM     sysobjects so
            INNER JOIN syscolumns sc ON so.id = sc.id
            INNER JOIN systypes st ON sc.xtype = st.xusertype
   WHERE    so.Name = 'Acisd'

但我看到的问题是过程在集合数据库中,表Acisd在不同的数据库中。所以当我执行程序时,它什么也没有给我回复。

如何解决这个问题?

5 个答案:

答案 0 :(得分:2)

不太确定你在这里会发生什么,但你可以通过完全限定表引用来将整个语句指向另一个数据库。

SELECT   sc.name
   FROM     OtherDatabase.dbo.sysobjects so
            INNER JOIN OtherDatabase.dbo.syscolumns sc ON so.id = sc.id
            INNER JOIN OtherDatabase.dbo.systypes st ON sc.xtype = st.xusertype
   WHERE    so.Name = 'Acisd'

答案 1 :(得分:1)

要在存储过程中执行此操作,您需要使用动态SQL。例如:

declare @sql nvarchar(max);
set @sql = N'SELECT   sc.name
      FROM ' + quotename(@dbanme) + N'.sys.objects so
      INNER JOIN ' + quotename(@dbname) + N'sys.columns sc ON so.id = sc.id
      INNER JOIN ' + quotename(@dbname) + N'sys.types st ON sc.xtype = st.xusertype
      WHERE so.Name = @objectName';
exec sp_executesql @sql, N'@objectName sysname', @objectName;

答案 2 :(得分:0)

在sybase中有函数db_name()到ktakeout当前数据库...不确定sqlserver

答案 3 :(得分:-1)

在MySQL中有一个“Use”子句,它可以在任何select语句之前。我相信在SQL-Server中也是如此。

答案 4 :(得分:-1)

正如previus所说,最简单的方法就是从

开始

USE [otherDatabasename]

GO

DECLARE @owner VARCHAR(20),     @Database VARCHAR(50)

SELECT @owner ='dbo',         @Database ='Asmin'

SELECT sc.name    来自sysobjects所以             INNER JOIN syscolumns sc ON so.id = sc.id.             INNER JOIN systypes st on sc.xtype = st.xusertype    在哪里.Name ='Acisd'