问题描述
我在一个像select * from dbo.MyTable
这样的数据库表上进行查询,尽管出于某种原因,我不知道该表MyTable
是用标识符中的尾随空格创建的,该查询仍然可以正常工作。
这不应该让我担心here所述,因为sql Server只忽略尾随空格。不幸的是,在某些情况下,我需要使用这样的链接服务器从该表中选择数据:
select *
from linkedserver.targetdb.dbo.[MyTable ]
不幸的是,查询是动态生成的,并且没有考虑尾随空间,因为对象名称与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;
,则即使删除了表的实际名称的尾随空格,它仍然可以工作。