0

我对这样的数据库表有一个查询,select * from dbo.MyTable即使出于某种原因我不知道该表MyTable 是在标识符中使用尾随空格创建的,它也可以正常工作。

这不应该让我担心,因为SQL Server 只是忽略尾随空格。不幸的是,我有一种情况需要使用这样的链接服务器从该表中选择数据:

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

我需要使用包含空格的引号名称,否则会出现错误:

为链接服务器“linkedserver”的提供程序“SQLNCLI11”指定了无效的架构或目录

不幸的是,查询是动态生成的,并且不考虑尾随空格作为对象名称与information_schema表的比较(正确忽略尾随空格)。

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

4

1 回答 1

3

考虑到,正如您所说,SQL Server 很高兴引用名为MyTable as的表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;

附加说明:如果您确实有一些引用该对象的代码,因为dbo.[YourTable ]如果表的实际名称中的尾随空格也被删除,它仍然可以工作。

于 2020-08-14T11:57:52.117 回答