2011-10-06 24 views
0

我已经创建了一个程序,它将为给定的表名输出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是在不同的数据库。所以当我执行程序时,它没有任何回报。

如何解决这个问题?

+0

资格与数据库和模式,用句点分隔表的/ proc /等名称。 'db_name..object_name'或'db_name.schema_name.object_name'(例如:'db_name.dbo.object_name')。 –

回答

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; 
+0

我收到以下错误消息214,级别16,状态3,过程sp_executesql内,1个线 过程需要类型的参数“@参数“NTEXT/NCHAR/NVARCHAR” 。 – peter

-1

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

+2

我知道,但不能在程序 – peter

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

中使用'使用'子句,如果您使用SQL Server 2005或更新版本,则应该使用sys.columns而不是syscolumns(对于其他系统目录视图) –

+0

@Joe Stefanelli请看我更新的问题。我为Schema名称和数据库使用了两个变量,因此我如何使用它们? – peter

-1

正如previus说,最简单的方法来做到这一点是通过简单地

USE [otherDatabasename]

GO

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

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

SELECT sc.name FROM系统对象所以 INNER JOIN syscolumns中SC ON so.id = sc.id INNER JOIN systypes中ST ON sc.xtype = st.xusertype WHERE so.Name = 'Acisd'

+0

不能使用“使用”条款的程序 – peter

0

在Sybase有功能DB_NAME()来ktakeout当前数据库......不知道SQLSERVER

相关问题