运行不带SQLCMD的创建函数代码

运行不带SQLCMD的创建函数代码,sql,sql-server,sqlcmd,Sql,Sql Server,Sqlcmd,我有DDL代码来创建一个从sqlcmd和其他特定SQL Server客户端完美运行的函数: /* * É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 --

我有DDL代码来创建一个从sqlcmd和其他特定SQL Server客户端完美运行的函数:

/*
 * É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]“@cadena”附近的语法不正确

我怀疑这与没有实现批处理分隔符有关。如果是这种情况,是否有其他语法?

总结一下我的评论:

SQL中的标准分隔符是

但是,在运行包含嵌入分号的代码块时(例如,在创建存储过程时),不能应用标准分隔符,因为在这种情况下,块不会作为单个语句发送

对于这些情况,SQL客户机通常有一些方法来定义一个替代的分隔符,该分隔符标记块的结束,并且通常具有比
更高的优先级

Microsoft将此“备用分隔符”称为“批处理分隔符”,并决定对此使用
GO
,所有Microsoft工具都坚持使用该分隔符。在SSMS中,此批处理分隔符实际上可以配置为其他内容

Oracle的SQL*Plus(和SQL开发人员)为此使用
/

其他SQL客户端允许在SQL脚本中使用动态定义,通常使用
分隔符
(或类似内容)更改后续语句的分隔符


因为我从来没有使用过DBeaver或HeidiSQL,所以我不知道这些SQL客户机是如何实现的

您需要告诉这些客户端您正在使用不同的分隔符。在SQL Fiddle中,您可以使用最初显示在源代码编辑器下方的
[;]
下拉列表来完成此操作。其他SQL客户端应该有类似的选项。@一个没有名字的\u horse\u我改为
[go]
编译架构,但仍然不能使用该函数,还缺少什么?在SQLServer中,必须在用户编写的函数前面加上schema/owner:
SELECT dbo.LPAD('hola',10',+')
@a_horse_和_no_name-关于SQL Fiddle,你当然是绝对正确的(我一定是瞎了!)。我是否应该假设如何设置分隔符完全取决于客户端,而不是标准SQL Server语法的一部分?@lvaroG.Vicario:SQL中的标准语句分隔符是
。但是当运行带有“嵌入式”
的代码块时然后是的,这完全取决于SQL客户机如何完成。我仍然没有机会测试它们是否实际工作,但separator是DBeaver中的一个连接设置和一个在HeidiSQL中打开文本框的按钮。我以前没有注意到,因为我不知道我必须去寻找它。