2015-09-07 4 views
1

У меня есть DDL код для создания функции, которая работает безотказно от Sqlcmd и других конкретных клиентов SQL Server:Run создать функциональный код без SQLCMD

/* 
* Émulo de la función LPAD() de Oracle 
*/ 
CREATE FUNCTION LPAD 
(
    @cadena VARCHAR(MAX), -- Texto de partida 
    @tamano INT,   -- Tamaño de la cadena resultante 
    @relleno CHAR   -- Carácter de relleno 
) 
RETURNS VARCHAR(MAX) 
AS 
BEGIN 
    return REPLICATE(@relleno, @tamano - LEN(@cadena)) + @cadena; 
END 
GO 

Однако, это не будет работать, как правило, от клиентов кросс-СУБД (SQL Fiddle, DBeaver, HeidiSQL ...):

[102] Неправильный синтаксис рядом с '@cadena'.

Я подозреваю, что это связано с тем, что пакетный разделитель GO не выполняется. Если это так, есть ли альтернативный синтаксис?

+0

Вы должны сообщить этим клиентам, что используете другой разделитель. В SQL Fiddle вы можете сделать это с выпадающим списком, который изначально показывает '[; ] 'под редактором исходного кода. Другие SQL-клиенты должны иметь аналогичные параметры. –

+0

@a_horse_with_no_name Я изменил на '[go]' компиляцию схемы, но все же не могу использовать функцию, что еще не хватает? [sqlFiddle] (http://sqlfiddle.com/#!6/9f008/3) –

+2

В SQL Server у вас ** есть ** для префикса написанных пользователем функций с помощью схемы/владельца: 'SELECT dbo.LPAD ('hola' , 10, '+'); 'http://sqlfiddle.com/#!6/9f008/4 –

ответ

2

Подытоживая мои комментарии:

Стандартный разделитель в SQL является ;.

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

В тех случаях клиент SQL обычно имеет некоторый способ определения альтернативного разделителя, который отмечает конец блока и, как правило, имеет более высокий приоритет, чем ;

Microsoft называет это «альтернативный разделитель» «партия отделена »и решил использовать GO для этого, и все инструменты Microsoft придерживаются этого. В SSMS этот разделитель партий может быть настроен на что-то еще.

Oracle SQL * Plus (и разработчик SQL) использует для этого /.

Другие SQL-клиенты позволяют динамическое определение внутри сценария SQL, обычно используя delimiter (или что-то подобное) для изменения разделителя для последующих операторов.

Как я никогда не использовал DBeaver или HeidiSQL Я не могу сказать, как это делается в этих SQL-клиентах.

+0

У меня все еще нет возможности проверить, действительно ли они работают, но разделитель - это параметр соединения в DBeaver и кнопка, которая открывает текстовое поле в HeidiSQL. Раньше я этого не замечал, потому что не знал, что должен искать его. –