【发布时间】:2020-05-10 10:24:37
【问题描述】:
我做了一个Oracle to SQL Server的项目,现在我有一个无法重建的功能,不知道是什么问题,
该函数用于获取Oracle sequene,结果错误。
Oracle函数代码
CREATE FUNCTION [test].[GETWORKORDERID] (numberPre varchar2)
return varchar2 is
PRAGMA AUTONOMOUS_TRANSACTION;
findId number(8); --maxid
nowNumber varchar2(50);
n_count number(8);
n_count2 number(8);
nowNumber2 varchar2(50);
begin
nowNumber := to_char(sysdate, 'yyyymmdd');
nowNumber2 := to_char(sysdate - 1, 'yyyymmdd');
select count(1)
into n_count2
from user_sequences t
where t.sequence_name = 'SEQ_' || numberPre || '_' || nowNumber2;
if n_count2 > 0 then
execute immediate 'drop sequence SEQ_' || numberPre || '_' ||
nowNumber2;
end if;
select count(1)
into n_count
from user_sequences t
where t.sequence_name = 'SEQ_' || numberPre || '_' || nowNumber;
if n_count = 0 then
execute immediate 'create sequence SEQ_' || numberPre || '_' ||
nowNumber ||
' minvalue 10000 maxvalue 99999999 start with 10000 increment by 1 NOCYCLE NOCACHE';
end if;
execute immediate 'select SEQ_' || numberPre || '_' || nowNumber ||
'.nextval from dual'
into findId;
commit;
return numberPre || nowNumber || findId;
end;**
我把SQL Server改成:
CREATE FUNCTION [test-CSR].[GETWORKORDERID]
(@numberPre nvarchar(max))
RETURNS TABLE
AS
BEGIN
DECLARE @findId bigint;
DECLARE @nowNumber bigint;
DECLARE @n_count bigint;
DECLARE @n_count2 bigint;
DECLARE @nowNumber2 bigint;
DECLARE @sql1 nvarchar(max);
DECLARE @sql2 nvarchar(max);
DECLARE @sql3 nvarchar(max);
DECLARE @sql4 nvarchar(max);
DECLARE @result nvarchar(max);
SET @nowNumber = CONVERT(varchar(30), GETDATE(), 20)
SET @nowNumber2 = CONVERT(varchar(30), GETDATE(), 20)
SELECT COUNT(1)
INTO n_count2
FROM user_sequences t
WHERE t.sequence_name = 'SEQ_' + numberPre + '_' + nowNumber2;
IF n_count2 > 0
BEGIN
SET @sql1 = 'drop sequence SEQ_' + numberPre + '_' + nowNumber2;
EXECUTE (@sql1)
END;
SELECT COUNT(1)
INTO n_count
FROM user_sequences t
WHERE t.sequence_name = 'SEQ_' + @numberPre + '_' + @nowNumber;
IF n_count = 0
BEGIN
SET @sql2 = 'create sequence SEQ_ ' + @numberPre + '_' + @nowNumber +
' minvalue 10000 maxvalue 99999999 start with 10000 increment by 1 NOCYCLE NOCACHE';
EXECUTE (@sql2)
END;
SET @sql3 = 'select SEQ_ ' + @numberPre + '_' + @nowNumber + '.NEXT VALUE FOR user_sequences';
SET @findId = @sql3;
SET @sql4 = @numberPre + @nowNumber + @findId;
INSERT INTO @result
EXEC (@sql4)
END;
现在我在SQL Server中重建函数,但是SQL Server运行的时候结果是错误的,不知道是什么错误?
【问题讨论】:
-
具体说明“运行错误”的含义。你有错误吗?如果是这样,消息是什么?事情是否没有像您期望的那样工作?如果是这样,你期望什么?我们没有你的数据库,其他人调试你的代码比你做的工作要多得多。
-
您的新函数甚至可以在 SQL Server 上编译吗?用户定义的函数一般不允许有 DDL 或
execute语句。
标签: sql-server oracle function