Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在过程中使用数据库名称_Sql Server_Tsql_Sql Server 2008_Stored Procedures - Fatal编程技术网

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
)。