Относительный путь в т sql? - PullRequest
       47

Относительный путь в т sql?

5 голосов
/ 26 сентября 2008

Как получить относительный путь в t sql? Возьмите, например, файл .sql, расположенный в папке D: \ temp, я хочу получить путь к файлу hello.txt в папке D: \ temp \ App_Data. Как использовать относительную ссылку на путь?

Допустим, я выполняю файл sql в студии управления SQL-сервером.

Ответы [ 7 ]

7 голосов
/ 13 ноября 2014

У меня была похожая проблема, и я решил ее с помощью переменных sqlcmd в сочетании с псевдопеременной% CD%. Взял немного проб и ошибок, чтобы объединить все части. Но в итоге все заработало. В этом примере предполагается, что файл script.sql находится в том же каталоге, что и runscript.bat.

runscript.bat

sqlcmd -S .\SQLINSTANCE -v FullScriptDir="%CD%" -i script.sql -b

script.sql

BULK INSERT [dbo].[ValuesFromCSV]
FROM '$(FullScriptDir)\values.csv'
with
(
    fieldterminator = ',',
    rowterminator = '\n'
)
go
6 голосов
/ 26 сентября 2008

Файл .sql - это просто .... файл. Это не имеет никакого смысла в своем собственном местоположении. Это то, что оправдывает его (который вы не указали), что будет иметь смысл его местоположения, местоположения файла.

Я заметил, что вы упомянули папку App_Data, поэтому я предполагаю, что ASP.NET участвует. Если вы хотите использовать относительные пути в своем веб-приложении, см. MapPath

http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx

4 голосов
/ 04 октября 2008

Сервер выполняет t-sql. Он не знает, откуда клиент загрузил файл. Вам нужно будет встроить путь в скрипт.

DECLARE @RelDir varchar(1000)
SET @RelDir = 'D:\temp\'
...

Возможно, вы можете программно поместить путь в команду SET в файле сценария .sql, или, возможно, вы можете использовать sqlcmd и передать соответствующий каталог в качестве переменной.

3 голосов
/ 26 сентября 2008

Когда T-SQL выполняется, он запускается в пакете на сервере, а не на клиентском компьютере, на котором запущена Management Studio (или любой другой клиент SQL). Клиент просто отправляет текстовое содержимое файла .sql на сервер для выполнения. Поэтому, если этот файл не находится на сервере базы данных, я очень сомневаюсь, что вы сможете взаимодействовать с ним из сценария SQL.

1 голос
/ 12 июня 2016

Я попробовал метод из комментариев mateuscb. Я обнаружил, что это не может работать, я не знаю, почему, то мне удалось после нескольких испытаний. Может работать со скриптом ниже:

runscript.bat

@set FullScriptDir=%CD%
sqlcmd -S .\SQLINSTANCE  -i script.sql

script.sql

BULK INSERT [dbo].[ValuesFromCSV]
FROM '$(FullScriptDir)\values.csv'
with
(
    fieldterminator = ',',
    rowterminator = '\n'
)
go

Просто для вашей информации для дальнейшего обсуждения.

1 голос
/ 30 октября 2011

Скрипт t-sql сначала предварительно обрабатывается QueryAnalyzer, SSMS или sqlcmd на стороне клиента. Эти программы знают о локализации файлов и могут легко обрабатывать относительные пути, аналогичные To Oeacle sqlplus.

Очевидно, что это всего лишь дизайнерское решение от Microsoft, и я осмелюсь сказать, что это довольно глупое решение.

0 голосов
/ 21 марта 2013

ну, во-первых, это не вещь от Microsoft ... это стандартная вещь. во-вторых, ваше решение для запуска T-SQL с относительным путем состоит в том, чтобы использовать пакетный сценарий или что-то еще, чтобы внедрить оператор пути IE:

@echo OFF
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t-SQL.SQL"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    set RunLocation=%~dp0
    echo(%~dp0!var! > newsql.sql
   ENDLOCAL
)
 sqlcmd newsql.sql

или что-то подобное в любом случае

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...