Sql server 如何在过程中使用数据库名称
我创建了一个过程,该过程将输出给定表名的Sql server 如何在过程中使用数据库名称,sql-server,tsql,sql-server-2008,stored-procedures,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
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
位于不同的数据库中。所以当我执行这个过程时,它什么也不返回
如何解决这个问题?在MySQL中,有一个“Use”子句,它可以位于任何select语句之前。我相信SQL-Server也是如此 不太确定您在这里要做什么,但是您可以通过完全限定表引用将整个语句指向另一个数据库
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'
正如previus所说,最简单的方法就是从 使用[otherDatabasename] 去 声明@owner VARCHAR(20), @数据库VARCHAR(50) 选择@owner='dbo', @数据库='Asmin' 选择sc.name 从sysobjects so.id=sc.id上的内部联接syscolumns sc sc.xtype=st.xusertype上的内部联接系统类型st
其中so.Name='Acisd'要在存储过程中执行此操作,需要使用动态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;
在sybase中,有一个函数db_name()用于生成当前数据库。。。对sqlserver不太确定我知道,但您不能在过程中使用'use'子句,如果您使用的是SQLServer2005或更新版本,您应该使用
sys.columns
,而不是syscolumns
(其他系统目录视图也是如此)@Joe Stefanelli请查看我更新的问题。我对模式名称和数据库使用了两个变量,那么如何使用它们呢?您不能在过程中使用'use'子句。我收到以下错误消息Msg 214,级别16,状态3,过程sp_executesql,第1行过程需要类型为“ntext/nchar/nvarchar”的参数“@parameters”。用数据库和架构限定表/proc/etc名称,并用句点分隔db\u name..object\u name
,或db\u name.schema\u name.object\u name
(示例:db\u name.dbo.object\u name
)。