运行 创建没有 SQLCMD 的函数代码
Run create function code without SQLCMD
我有 DDL 代码来创建 运行 完美地来自 sqlcmd 和其他特定 SQL 服务器客户端的函数:
/*
* É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
但是,它通常不会 运行 来自跨 DBMS 客户端(SQL Fiddle、DBeaver、HeidiSQL...):
[102] Incorrect syntax near '@cadena'.
我怀疑这与未实施 GO
批处理分隔符有关。如果是这样,是否有替代语法?
总结一下我的评论:
SQL 中的标准分隔符是 ;
。
但是,当 运行 包含嵌入分号的代码块(例如,创建存储过程时)时,无法应用标准分隔符,因为在这种情况下,块不会作为单一声明发送。
对于这些情况,SQL 客户端通常有一些方法来定义标记块结束的备用分隔符,并且通常比 ;
具有更高的优先级
Microsoft 将此 "alternate delimiter" 称为 "batch separated" 并决定为此使用 GO
,所有 Microsoft 工具都坚持这一点。在 SSMS 中,这个批次分隔符实际上可以配置为其他东西。
Oracle 的 SQL*Plus(和 SQL 开发人员)为此使用 /
。
其他 SQL 客户端允许在 SQL 脚本中进行动态定义,通常使用 delimiter
(或类似的东西)来更改后续语句的分隔符。
因为我从未使用过 DBeaver 或 HeidiSQL,所以我不知道这些 SQL 客户端是如何完成的。
我有 DDL 代码来创建 运行 完美地来自 sqlcmd 和其他特定 SQL 服务器客户端的函数:
/*
* É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
但是,它通常不会 运行 来自跨 DBMS 客户端(SQL Fiddle、DBeaver、HeidiSQL...):
[102] Incorrect syntax near '@cadena'.
我怀疑这与未实施 GO
批处理分隔符有关。如果是这样,是否有替代语法?
总结一下我的评论:
SQL 中的标准分隔符是 ;
。
但是,当 运行 包含嵌入分号的代码块(例如,创建存储过程时)时,无法应用标准分隔符,因为在这种情况下,块不会作为单一声明发送。
对于这些情况,SQL 客户端通常有一些方法来定义标记块结束的备用分隔符,并且通常比 ;
Microsoft 将此 "alternate delimiter" 称为 "batch separated" 并决定为此使用 GO
,所有 Microsoft 工具都坚持这一点。在 SSMS 中,这个批次分隔符实际上可以配置为其他东西。
Oracle 的 SQL*Plus(和 SQL 开发人员)为此使用 /
。
其他 SQL 客户端允许在 SQL 脚本中进行动态定义,通常使用 delimiter
(或类似的东西)来更改后续语句的分隔符。
因为我从未使用过 DBeaver 或 HeidiSQL,所以我不知道这些 SQL 客户端是如何完成的。