Как определить имя экземпляра LocalDb в сценарии SQL?

Для SQL Server, отличного от LocalDb, я могу SELECT SERVERPROPERTY('ServerName') получить имя сервера и экземпляр, на котором я работаю. Однако для сервера LocalDb я получаю SERVERNAME\LOCALDB#SOMEHASH. Как я могу получить имя локального экземпляра?

РЕШЕНИЕ:

Решение для получения экземпляра, работающего как с LocalDB, так и с «обычными» экземплярами SQL Server:

DECLARE @serverName NVARCHAR(151)
IF SERVERPROPERTY('IsLocalDb') = 1
    SELECT @serverName = 'np:\\.\pipe\' + CONVERT(NVARCHAR(128), SERVERPROPERTY('InstanceName')) + '\tsql\query'
ELSE
    SELECT @serverName = CONVERT(NVARCHAR(128), SERVERPROPERTY('ServerName'))

Некоторая предыстория, которую я должен был упомянуть в исходном вопросе: у нас есть база данных конфигурации для нашего приложения. Среди прочего, он хранит строки подключения. Для компьютеров разработчиков и интеграционных тестов мы хотим иметь возможность генерировать базу данных с помощью скрипта, а строка подключения должна ссылаться на локальный экземпляр. Таким образом, мне нужно иметь рабочую строку подключения (которой LOCALDB#SOMEHASH нет). Поскольку в редакции сервера базы данных есть некоторый разброс, мне нужно было что-то, что могло бы справиться с обоими случаями.


person carlpett    schedule 28.02.2013    source источник
comment
Почему SERVERNAME\LOCALDB#SOMEHASH неприемлемо?   -  person Raymond Saltrelli    schedule 28.02.2013
comment
@RaySaltrelli: потому что его нельзя использовать для подключения к локальной базе данных из кода в моих тестах.   -  person carlpett    schedule 28.02.2013
comment
Выберите @@Servername не то, что вам нужно?   -  person granadaCoder    schedule 28.02.2013
comment
@granadaCoder: это то же самое, что и SERVERPROPERTY('ServerName')   -  person carlpett    schedule 28.02.2013
comment
Извиняюсь. Думаю, я охренел. Можете ли вы запустить Select @@VERSION и опубликовать?   -  person granadaCoder    schedule 28.02.2013
comment
он должен быть динамичным? или имя вашего сервера/экземпляра статично?   -  person RandomUs1r    schedule 28.02.2013
comment
Мне нужно было решение для запуска bcp из хранимой процедуры. Я создаю хранимую процедуру на своей локальной базе данных и буду развертывать ее на сервере sql 2016. Но мне нужно выполнить развертывание с помощью автоматического сценария. Поэтому я не могу редактировать процесс заранее. @@servername в localdb возвращает имя, которое bcp не принимает. Но приведенное выше решение сработало для меня в dev и qa/prod. Спасибо!   -  person Ken Hadden    schedule 22.07.2020


Ответы (1)


Это:

SELECT SERVERPROPERTY ('InstanceName')

ИЗМЕНИТЬ

по ссылке

Подключение к общему экземпляру LocalDB

Чтобы подключиться к общему экземпляру LocalDB, добавьте .\ (точка + обратная косая черта) в строку подключения, чтобы указать пространство имен, зарезервированное для общих экземпляров. Например, чтобы подключиться к общему экземпляру LocalDB с именем AppData, используйте строку подключения, такую ​​как (localdb).\AppData, как часть строки подключения. Пользователь, подключающийся к общему экземпляру LocalDB, которым он не владеет, должен иметь логин с проверкой подлинности Windows или проверкой подлинности SQL Server.

и

Если ваше приложение использует версию .NET до 4.0.2, вы должны подключиться напрямую к именованному каналу LocalDB. Значение имени канала экземпляра — это именованный канал, который прослушивает экземпляр LocalDB. Часть имени канала экземпляра после LOCALDB# будет меняться каждый раз при запуске экземпляра LocalDB. Чтобы подключиться к экземпляру LocalDB с помощью SQL Server Management Studio, введите имя канала экземпляра в поле Имя сервера диалогового окна Подключение к ядру СУБД. Из вашей пользовательской программы вы можете установить соединение с экземпляром LocalDB, используя строку подключения, подобную SqlConnection conn = new SqlConnection(@"Server=np:\\.\pipe\LOCALDB#F365A78E\tsql\query");

person shibormot    schedule 28.02.2013
comment
К сожалению, это возвращает часть LOCALDB#SOMEHASH. - person carlpett; 28.02.2013
comment
знакомы ли вы с этим - person shibormot; 28.02.2013
comment
Да, и поэтому мой вопрос. По крайней мере, в моем быстром тесте я не смог подключиться к (localdb)\LOCALDB#SOMEHASH. Должен ли я ожидать, что смогу? - person carlpett; 28.02.2013
comment
@carlpett и еще раз) - person shibormot; 28.02.2013
comment
Превосходно! Не знал о возможности использования именованного канала в строке подключения. Обновленный вопрос с решением - person carlpett; 01.03.2013