Использование переменных в SQLCMD для Linux

Я запускаю инструмент Microsoft SQLCMD для Linux (CTP 11.0.1720.0) на компьютере с Linux (Red Hat Enterprise Server 5.3 tikanga) с оболочкой Korn. Инструмент правильно настроен и работает во всех случаях, кроме использования переменных сценария.

У меня есть SQL-скрипт, который выглядит так.

SELECT COLUMN1 FROM TABLE WHERE COLUMN2 = '$(param1)';

И я запускаю команду sqlcmd вот так.

sqlcmd -S server -d database -U user -P pass -i input.sql -v param1="DUMMYVALUE"

Когда я выполняю указанную выше команду, я получаю следующую ошибку.

Sqlcmd: 'param1=DUMMYVALUE': Invalid argument. Enter '-?' for help.

Справка перечисляет приведенный ниже синтаксис.

[-v var = "value"...]

Я что-то упустил здесь?


person GPX    schedule 26.07.2012    source источник
comment
Пробовали ли вы просто для целей тестирования запустить sqlcmd только с аргументом -v param1=DUMMYVALUE? Хотя ошибка относится к нему, было бы неплохо убедиться, что именно этот аргумент вызывает проблему. Вы также можете поместить его в качестве первого аргумента и посмотреть, изменится ли что-нибудь.   -  person Diego    schedule 26.07.2012
comment
Существует ли инструмент SQLCMD для Linux?   -  person Remus Rusanu    schedule 26.07.2012
comment
@ Диего Да, я пробовал это. Почти уверен, что здесь проблема -v.   -  person GPX    schedule 26.07.2012
comment
@RemusRusanu Ага! Дополнительная документация здесь — msdn.microsoft.com/en-us/library/hh568447. aspx   -  person GPX    schedule 26.07.2012
comment
Смотри, у моего окна только что приземлилась летающая свинья...   -  person Remus Rusanu    schedule 26.07.2012


Ответы (4)


В версии RTP (11.0.1790.0) Переключатель -v не отображается в списке параметров при выполнении sqlcmd -?. По-видимому, эта опция не поддерживается в версии инструмента для Linux.
Насколько я могу судить, импорт значений параметров из переменных среды также не работает.

Если вам нужен обходной путь, одним из способов будет объединение одного или нескольких операторов :setvar с текстовым файлом, содержащим команды, которые вы хотите запустить, в новый файл, а затем выполнить новый файл. На основе вашего примера:

echo :setvar param1 DUMMYVALUE > param_input.sql
cat input.sql >> param_input.sql
sqlcmd -S server -d database -U user -P pass -i param_input.sql 
person Ed Harper    schedule 26.07.2012
comment
Это работает. Хотя мне интересно, почему -v все еще появляется, когда я запускаю sqlcmd -?, и все же это не сработает. - person GPX; 01.08.2012
comment
@GPX - я предполагаю, что это никогда не работало (из-за совпадения переменных среды в различных оболочках Linux с использованием нотации $) и что справка была исправлена ​​​​между CTP и версией выпуска. - person Ed Harper; 01.08.2012

Вам не нужно передавать переменные в sqlcmd. Он автоматически выбирает из ваших переменных оболочки: например.

экспорт param1 = DUMMYVALUE

sqlcmd -S $host -U $user -P $pwd -d $db -i input.sql

person Anand    schedule 27.04.2017

Вы можете экспортировать переменную в linux. После этого вам не нужно будет передавать переменную в sqlcmd. Однако я заметил, что вам нужно будет изменить свой сценарий sql и удалить команду :setvar, если она не имеет значения по умолчанию.

export dbName=xyz
sqlcmd -Uusername -Sservername -Ppassword -i script.sql


:setvar dbName  --remove this line
USE [$(dbName)]
GO
person PingPongOng    schedule 05.04.2018

Я думаю, вы просто неправильно цитируете входные переменные. Я создал этот bash-скрипт...

#!/bin/bash
# Create a sql file with a parameterized test script
echo "
set nocount on
select k = '-db', v = '\$(db)' union all
select k = '-schema', v = '\$(schema)' union all
select '-', 'static'
go" > ./test.sql

# capture input variables
DB=$1 
SCHEMA="${2:-dbo}"

# Exec sqlcmd
sqlcmd -S 'localhost\lemur' -E -i ./test.sql -v "db=${DB}" -v "schema=${SCHEMA}"

... и проверил это так:

$ ./test.sh master
k       v     
------- ------
-db     master
-schema dbo
-       static
person Xedni    schedule 27.09.2020