我知道我可以执行以下操作:
EXEC Server_Name.DBName.sys.sp_executesql N'TRUNCATE TABLE dbo.table_name'
Run Code Online (Sandbox Code Playgroud)
但是如果我想使用表的同义词怎么办?
我在 SERVER1 上,想使用表名的同义词截断 SERVER2 上的表。
这可能吗?
在我的公司,我们有多个带有 MS SQL 数据库服务器的环境(SQL 2008 R2、SQL 2014)。为了简单起见,我们只考虑一个 TEST 环境和一个 PROD 环境,每个环境都有两个 sql 服务器。让服务器名为srTest1、srTest2、srProd1、srProd2,并且每个服务器都运行默认的 MS SQL Server 实例。我们使用多个数据库,例如 DataDb、ReportDb、DWHDb。
我们希望在 T-SQL 中为 TEST 和 PROD 保留相同的源代码,但问题是上述数据库在每个环境中的架构或分布:
测试:
产品:
现在,比如说,在 ReportDb 中,我们编写存储过程,其中包含许多引用 DataDb 和 DWHDb 中的表和其他对象的 SELECT。为了使源代码尽可能通用,我们决定为每个环境中每个数据库服务器上的每个数据库创建链接服务器,并根据为其创建的数据库来命名它们。因此,将会有这些链接服务器:
我们将相应地调整存储过程中的源。例如:
代替 …
为什么必须先删除链接服务器才能对服务器进行更改?为什么您无法查看服务器的属性,即用户名访问权限等?在能够更改表并进行更改之前先删除表是否可行?使用 drop 和 create to 来获取链接服务器的属性是否安全,或者设置是否会被删除?是否有 SQL 命令可以让您查看链接服务器的属性?
我使用的是不断写入/读取的 MS SQL 数据库,以及通过链接服务器连接链接到的数据库。SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED这就是我在运行的每个查询中使用的原因。我的问题是,此事务级别是否会用于链接服务器上运行的查询?假设我的服务器被调用General并且它链接到服务器Linked。如果我运行以下查询:
select *
from General.TableName
join Linked.[Database].dbo.AnotherTableName on 1 = 1
Run Code Online (Sandbox Code Playgroud)
会Linked.Database.dbo.AnotherTableName被(IS)锁定吗?
我通过链接服务器从我的 sql server 2017 Standard 查询远程 postgresql 服务器时出错
这是查询:
SELECT CAST(test AS VARCHAR(MAX)) FROM OpenQuery(xxxx,
'SELECT corpo::TEXT as test From public.notification')
Run Code Online (Sandbox Code Playgroud)
这是错误消息:
Msg 7347, Level 16, State 1, Line 57
OLE DB provider 'MSDASQL' for linked server 'xxx' returned data that does not match expected data length for
column '[MSDASQL].test'. The (maximum) expected data length is 1024, while the returned data length is 7774.
Run Code Online (Sandbox Code Playgroud)
即使没有转换,错误仍然存在
对于 odbc 和链接服务器,我遵循了这个方便的指南。
我能够执行直接查询链接服务器的存储过程,但是当我通过ASP.NET调用相同的sproc时,我收到以下错误:
拒绝访问远程服务器,因为不存在登录映射.
当我通过SSMS执行它时,我通过我的Windows域帐户连接.
该站点是ASP.NET,在IIS 7上使用表单身份验证,在本地计算机上使用SQL 2008.
对于所有登录,链接服务器设置为"使用此安全上下文进行".
我在SQL Server 2008中设置了链接服务器.但我无法对链接服务器运行任何查询.

我试图运行这个简单的命令,但它不起作用
SELECT * FROM MYSERVER..ALANH.TEMP_UPDATE1
Run Code Online (Sandbox Code Playgroud)
这是我运行上面命令时得到的错误.
Msg 7399, Level 16, State 1, Line 1
The OLE DB provider "OraOLEDB.Oracle" for linked server "MYSERVER" reported an error. The provider did not give any information about the error.
Msg 7312, Level 16, State 1, Line 1
Invalid use of schema or catalog for OLE DB provider "OraOLEDB.Oracle" for linked server "MYSERVER". A four-part name was supplied, but the provider does not expose the necessary interfaces to use a catalog …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过链接服务器调用远程存储过程.问题是,所需参数之一是用户定义的表类型.
我似乎无法弄清楚如何从远程服务器将局部变量声明为用户定义的表类型.
这是我到目前为止所尝试的,但它不起作用:
DECLARE @tblVar [REMOTESERVER].REMOTEDB.dbo.user_defined_table_type
EXEC [REMOTESERVER].REMOTEDB.dbo.procedure_name (@param1 = @tblVar)
Run Code Online (Sandbox Code Playgroud)
但是我得到的错误是:
类型名称"REMOTESERVER.REMOTEDB.dbo"包含的前缀数量超过最大数量.最大值为1.
必须声明标量变量"@tblVar"
t-sql sql-server linked-server user-defined-types sql-server-2008-r2
我有两个SQL Server 2008的计算机上,SQLSERVER1和SQLSERVER2(原秀)
在SQLSERVER2,我做:
[SQLSERVER1].[DATABASE].[DBO].StoreProcedure1
Run Code Online (Sandbox Code Playgroud)
一切顺利.
但是,如果我进入触发器,我会收到此错误
链接服务器"[SQLSERVER1]"的OLE DB提供程序"SQLNCLI10"返回消息"没有事务处于活动状态.".
消息7391,级别16,状态2,过程StoreProcedure1,第57行
无法执行操作,因为链接服务器"[SQLSERVER1]"的OLE DB提供程序"SQLNCLI10"无法启动分布式事务.
我找到了代码所在的示例:
SELECT * FROM [legacyserver].[database].[schema].[table]
Run Code Online (Sandbox Code Playgroud)
表达为:
SELECT * FROM [legacyserver]...[table]
Run Code Online (Sandbox Code Playgroud)
但不适合我.
它给了我错误:
为链接服务器"legacyserver"的提供程序"MSDASQL"指定了无效的架构或目录.
我用于旧服务器SQL SERVER 2000和新服务器SQL SERVER 2012.
我尝试使用以下方法创建链接服务器
EXEC sp_addlinkedserver
@server = 'legacyserver',
@srvproduct = '',
@provider = 'MSDASQL',
@provstr = 'DRIVER={SQL Server};SERVER=legacyserver;DATABASE=database;Trusted_Connection=Yes;',
Run Code Online (Sandbox Code Playgroud)
和:
EXEC sp_addlinkedserver
@server = 'legacyserver',
@srvproduct = '',
@provider = 'MSDASQL',
@provstr = 'DRIVER={SQL Server};SERVER=legacyserver;Trusted_Connection=Yes;',
@catalog = 'database';
Run Code Online (Sandbox Code Playgroud)
是否可以在不对数据库名称进行硬编码的情况下创建脚本?
我需要创建一个非常大的迁移脚本,它需要使用开发,接受和生产数据库,并且在文本编辑器中使用replace会更改它并且容易出错.
更新:
遗留的开发,验收和生产数据库完全相同(数据除外),每个数据库都有自己的服务器/实例和数据库名称.
由于职责分离,我无法开发并部署它,因此我无法在接受后触摸此脚本.我需要指导别人这样做,如果他/她将需要更换的[legacyserver]每次出现.[数据库],出错的几率非常高.
linked-server ×10
sql-server ×8
t-sql ×3
asp.net ×1
locking ×1
oracle ×1
performance ×1
sql ×1
synonym ×1
triggers ×1