Почему 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 ]
он по-прежнему будет работать, если также будут удалены конечные пробелы из фактического имени таблицы.