61

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

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

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

4

10 回答 10

90

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

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

如果要连接多台服务器,请务必GO在连接之间插入;否则,您的 T-SQL 将不会在您认为它会执行的服务器上执行。

于 2010-06-30T21:05:54.120 回答
52

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

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

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

于 2008-09-24T05:04:02.460 回答
28

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


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

USE master
GO
EXEC sp_addlinkedserver 
    'SEATTLESales',
    N'SQL Server'
GO
于 2008-09-24T04:52:15.123 回答
6

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

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

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

于 2008-09-24T05:06:46.040 回答
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
于 2011-11-18T12:02:06.587 回答
4

如果您要连接到多个服务器,则应在切换服务器之前添加“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

于 2014-04-07T16:03:27.047 回答
2

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

于 2008-09-24T04:51:14.767 回答
2

在我的 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

如果一切顺利

就是这样

于 2015-06-20T07:44:20.387 回答
0

尝试 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();
于 2019-02-12T14:29:41.510 回答
-1

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

于 2010-06-17T20:11:46.093 回答