我创建了一个过程,它将为给定的表名输出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 :(得分: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'