与链接服务器一起使用时,为什么TSQL不能忽略标识符的尾随空格?

问题描述

我在一个select * from dbo.MyTable这样的数据库表上进行查询,尽管出于某种原因,我不知道该表MyTable 是用标识符中的尾随空格创建的,该查询仍然可以正常工作。

这不应该让我担心here所述,因为sql Server只忽略尾随空格。不幸的是,在某些情况下,我需要使用这样的链接服务器从该表中选择数据:

select * 
from linkedserver.targetdb.dbo.[MyTable   ]

我需要使用引号名(包括空格),否则会出现错误

链接服务器“ linkedserver”的提供者“ sqlNCLI11”指定了无效的架构或目录

不幸的是,查询是动态生成的,并且没有考虑尾随空间,因为对象名称information_schema表的比较很有效(正确地忽略了尾随空间)。

这可能与提供程序sqlNCLI11或链接服务器的配置有关吗?

解决方法

考虑到您所说的,SQL Server很高兴将名为int value = 5; // we'll constructor a new object,value doens't need to be const std::unique_ptr<const int> ptr{nullptr}; ptr = std::make_unique<const int>(value); // construct a new object and pass the ownership to ptr 的表引用为MyTable ,除了使用链接服务器查询时,显而易见的解决方案是修复表的名称。

您可以使用MyTable进行此操作。例如:

sp_rename

附加说明:如果您确实有一些代码将该对象引用为USE Sandbox; GO CREATE TABLE dbo.[YourTable ] (SomeCol int); GO DECLARE @SQL nvarchar(100) = N'SELECT * FROM dbo.YourTable;'; --Just to prove the same statement is run EXEC sys.sp_executesql @SQL; SELECT DATALENGTH([name]) --returns 20,so spaces are tehre FROM sys.tables WHERE [name] LIKE N'MyTabl%'; EXEC sys.sp_rename N'dbo.YourTable ',N'YourTable'; EXEC sys.sp_executesql @SQL; SELECT DATALENGTH([name]) --Returns 14,so spaces are gone. FROM sys.tables WHERE [name] LIKE N'MyTabl%'; GO DROP TABLE dbo.YourTable; ,则即使删除了表的实际名称的尾随空格,它仍然可以工作。