Почему TSQL не игнорирует конечные пробелы идентификаторов при использовании со связанным сервером?

У меня есть запрос к такой таблице базы данных select * from dbo.MyTable который отлично работает, хотя я не знаю таблицу MyTable был создан с конечными пробелами в идентификаторе.

Это не должно вызывать у меня беспокойства, как описано здесь, поскольку SQL Server просто игнорирует конечные пробелы. К сожалению, у меня есть случай, когда мне нужно выбрать данные из этой таблицы, используя связанный сервер, например:

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

Мне нужно использовать кавычки, включая пробелы, иначе я получаю сообщение об ошибке:

Для поставщика "SQLNCLI11" для связанного сервера "связанный сервер" указана недопустимая схема или каталог.

К сожалению, запросы генерируются динамически и не учитывают конечный пробел как сравнение имени объекта с information_schema таблица работает (правильно игнорируя конечные пробелы).

Может ли это быть связано с поставщиком SQLNCLI11 или конфигурацией связанного сервера?

1 ответ

Учитывая, что, как вы заявили, SQL Server "счастлив" ссылаться на таблицу с именем 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;

Дополнительное примечание: если у вас есть код, который ссылается на объект как dbo.[YourTable ] он по-прежнему будет работать, если также будут удалены конечные пробелы из фактического имени таблицы.

Другие вопросы по тегам