运行不带SQLCMD的创建函数代码
我有DDL代码来创建一个从sqlcmd和其他特定SQL Server客户端完美运行的函数:运行不带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 --
/*
* É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中打开文本框的按钮。我以前没有注意到,因为我不知道我必须去寻找它。