【问题标题】:What is the T-SQL syntax to connect to another SQL Server?连接到另一个 SQL Server 的 T-SQL 语法是什么?
【发布时间】:2010-09-12 15:10:39
【问题描述】:

如果我需要将存储过程 (SP) 从一个 SQL Server 复制到另一个,我右键单击 SSMS 中的 SP 并选择脚本存储过程作为 > 创建到 > 新查询编辑器窗口。然后我通过右键单击该窗口并选择 Connection > Change Connection... 来更改连接,然后选择新服务器和 F5 以在新服务器上运行创建。

所以我的问题是“连接到另一个 SQL Server 的 T-SQL 语法是什么?”这样我就可以将它粘贴到创建脚本的顶部并按 F5 来运行它,它会切换到新服务器并运行创建脚本。

在输入问题时,我意识到如果我向您提供我正在尝试做的事情的背景,您可能会想出一个更快更好的方法来完成此任务。

【问题讨论】:

    标签: sql-server tsql stored-procedures ssms


    【解决方案1】:

    在 SQL Server Management Studio 中,从“查询”菜单打开 SQLCMD 模式。 然后在脚本的顶部,输入下面的命令

    :Connect server_name[\instance_name] [-l timeout] [-U user_name [-P password]
    

    如果要连接多台服务器,请务必在连接之间插入GOotherwise your T-SQL won't execute on the server you're thinking it will.

    【讨论】:

    • 如果您连接到多个服务器,您应该在切换服务器之前添加一个“GO”,否则您的 sql 语句将针对错误的服务器运行。 sqlmatters.com/Articles/…
    • 如何关闭 SQLCMD 模式?
    【解决方案2】:

    另外,请确保在编写涉及链接服务器的查询时,包括这样的括号:

    SELECT * FROM [LinkedServer].[RemoteDatabase].[User].[Table]
    

    我发现至少在 2000/2005 年,[] 括号是必需的,至少在服务器名称周围是必需的。

    【讨论】:

    • 我认为 mwg2002 的回答可能更正确地回答了这个问题。这里的这个答案解释了如何查询另一台服务器,而另一个答案正确解释了如何动态更改连接(需要注意的是必须在 SSMS 中启用 SQLCMD 模式)。
    【解决方案3】:

    更新:要连接到另一个 sql server 并执行 sql 语句,你必须使用sqlcmd Utility。这通常在批处理文件中完成。 如果您想在管理工作室中执行它,可以将其与 xmp_cmdshell 结合使用。


    一种方法是配置linked server。然后您可以将链接服务器和数据库名称附加到表名称中。 (从linkedserver.database.dbo.TableName中选择*)

    USE master
    GO
    EXEC sp_addlinkedserver 
        'SEATTLESales',
        N'SQL Server'
    GO
    

    【讨论】:

    • 这其实是具体问题的正确答案。或者更确切地说,首先您确保其他服务器已链接并因此可查询,然后您可以按照 Codewerks 的说明选择其他服务器。
    【解决方案4】:

    如果我要解释这个问题 - 是否可以选择服务器上下文以在 DDL 中执行查询 - 答案是否定的。只能使用 USE 以编程方式选择数据库上下文。 (已经在外部预先选择了服务器上下文)

    链接服务器和 OPEN QUERY 可以提供对 DDL 的访问权限,但需要对代码进行一定程度的重写以封装为字符串 - 这使得开发/调试变得困难。

    或者,您可以求助于外部驱动程序来获取 SQL 文件,以通过 OPEN QUERY 发送到远程服务器。但是,在大多数情况下,您最好在第一处直接连接到服务器来评估 DDL。

    【讨论】:

      【解决方案5】:

      每当我们尝试从另一台服务器检索任何数据时,我们都需要两个步骤。

      第一步:

      -- Server one scalar variable
      DECLARE @SERVER VARCHAR(MAX)
      --Oracle is the server to which we want to connect
      EXEC SP_ADDLINKEDSERVER @SERVER='ORACLE'
      

      第二步:

      --DBO is the owner name to know table owner name execute (SP_HELP TABLENAME)    
      SELECT * INTO DESTINATION_TABLE_NAME 
      FROM ORACLE.SOURCE_DATABASENAME.DBO.SOURCE_TABLE
      

      【讨论】:

        【解决方案6】:

        如果您要连接到多台服务器,则应在切换服务器之前添加“GO”,否则您的 sql 语句将针对错误的服务器运行。

        例如

        :CONNECT SERVER1
        Select * from Table
        GO
        enter code here
        :CONNECT SERVER1
        Select * from Table
        GO
        

        http://www.sqlmatters.com/Articles/Changing%20the%20SQL%20Server%20connection%20within%20an%20SSMS%20Query%20Windows%20using%20SQLCMD%20Mode.aspx

        【讨论】:

        • (1)SQLCMD模式,(2):CONNECT,(3)USE,(4)SELECT
        【解决方案7】:

        尝试创建一个链接服务器(可以使用sp_addlinkedserver),然后使用OPENQUERY

        【讨论】:

        • Wayne - 如果我正确理解您的建议,那么这会执行位于 server2 上 server1 上的 SP,对吗?它不会在 server2 上创建相同的 SP 吗?
        • 它在 server1 上执行一个 sp,打开一个到 server2 的链接。然后,您可以通过查询或调用 server2 上的某些内容进行 pasa。
        【解决方案8】:

        在我的 C 盘上,我首先创建一个 txt 文件来创建一个新表。你可以在这个文本文件中使用任何你想要的东西

        在这种情况下,文本文件称为“Bedrijf.txt”

        内容:

        Print 'START(A) create table'
        
        GO 1
        
        If not EXISTS
        (
            SELECT *
            FROM INFORMATION_SCHEMA.TABLES
            WHERE TABLE_NAME = 'Bedrijf'
        )
        BEGIN
        CREATE TABLE [dbo].[Bedrijf] (
        [IDBedrijf] [varchar] (38)   NOT NULL ,
        [logo] [varbinary] (max) NULL ,
        [VolledigeHandelsnaam] [varchar] (100)  NULL 
        ) ON [PRIMARY]
        

        保存

        然后我创建另一个名为“Bedrijf.bat”和扩展名 bat 的 txt 文件。 内容:

        OSQL.EXE  -U Username -P Password -S IPaddress -i C:Bedrijf.txt -o C:Bedrijf.out -d myDatabaseName
        

        保存并在资源管理器中双击执行

        结果将保存在 C 盘上名为“Bedrijf.out”的 txt 文件中

        它显示

        1> 2> 3> START(A) create table
        

        如果一切顺利

        就是这样

        【讨论】:

          【解决方案9】:

          试试 PowerShell 类型:

          $cn = new-object system.data.SqlClient.SQLConnection("Data Source=server1;Initial Catalog=db1;User ID=user1;Password=password1");
          $cmd = new-object system.data.sqlclient.sqlcommand("exec Proc1", $cn);
          $cn.Open();
          $cmd.CommandTimeout = 0
          $cmd.ExecuteNonQuery()
          $cn.Close();
          

          【讨论】:

            【解决方案10】:

            如果可能,请查看 SSIS(SQL Server 集成服务)。我刚刚开始使用这个工具包,但已经在循环超过 40 台服务器并准备造成各种破坏;)

            【讨论】:

            • 这并不能真正回答他的问题。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2015-09-13
            • 1970-01-01
            • 2015-09-03
            相关资源
            最近更新 更多