【问题标题】:Postgresql function transform to sql server not workingPostgresql 函数转换为 sql server 不工作
【发布时间】:2022-11-25 10:57:29
【问题描述】:

我必须将 postgresql 函数转换为 sql server

Postgresql 函数,我必须将其转换为 sql server

CREATE FUNCTION mismatch
(
    column1 text,
    column2 integer,
    column3 integer
)
RETURNS bigint
AS
$$
BEGIN

    RAISE EXCEPTION 'column1[%]column2[%]column3[%]', column1, column2, column3
    USING ERRCODE = '50002';

END;
$$
LANGUAGE plpgsql;

这个 postgresql 函数在下面的查询中调用,在 CTE 中使用,然后更新表

SELECT mismatch('text', @column1, columnname)
            FROM foo
            WHERE (@id <= 1 OR id = @id)
            AND idKey = @idKey
            AND Index1 = 0

我已经尝试在 sql server 中使用标量用户定义函数但没有工作

CREATE FUNCTION mismatch
(
    @column1 varchar(max),
    @coulmn2 integer,
    @coulmn3 integer
)
RETURNS bigint
AS
BEGIN


RAISERROR(N'column1%scolumn2%scolumn3%s'
              ,50002
              ,1
              ,@column1
              ,@coulmn2
              ,@column3);

END;

我曾考虑在 SQL Server 中使用 try-catch 事务,但是 postgresql 将它与选择查询结合使用。还有其他方法吗,thnksss

【问题讨论】:

  • 但不工作” - 这是什么意思?...到底是什么不起作用?...您是否收到错误,错误是什么?

标签: sql-server tsql sql-server-2017 stored-functions


【解决方案1】:

有3处错误

第一的

变量名错误:

@comn1 varchar(最大),

@co乌尔mn2 整数,

@co乌尔mn3 整数

在 raiserror 中:

,@公司mn1 ,@公司乌尔mn2 ,@公司mn3);

第二

SQL中任何函数都必须有RETURN语句,所以加一个RETURN 0就可以解决

第三

T-SQL 函数将为每一行执行,因此函数中不能有 RAISERROR,但您可以强制报错:

CREATE FUNCTION CHECK_EVIL(@VALUE VARCHAR(100)) RETURNS BIT AS BEGIN
    IF @VALUE LIKE '%EVIL%'
        SET @VALUE = 'There is "evil" in your value' --It can't be converted to BIT
    ELSE
        SET @VALUE = 0
    RETURN @VALUE
END

测试:

SELECT DBO.CHECK_EVIL('这没问题') --> 返回 0

SELECT DBO.CHECK_EVIL('uh evil') --> 引发错误:

消息 245,级别 16,状态 1,第 10 行

转换 varchar 值时转换失败 '你的价值观有“恶”' 到数据类型位。

很恶心吗?是的,但它有效

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-14
    • 2017-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多