我知道,SQL Server 整数最好用 NUMBER(10) 表示。
但有时我已经将一些维护脚本迁移到 Oracle,我想知道我是否必须小心地将整数映射到 NUMBER(10) 或者我是否可以在 Oracle 中使用 ansi 类型整数。
有什么理由不使用整数吗?
编辑:
我对 10g 进行了验证。
create table BK_int_test(
i_col integer,
f_col float);
insert into BK_int_test values (1, 1);
insert into BK_int_test values (1.1, 1.1);
Select * from BK_int_test;
Run Code Online (Sandbox Code Playgroud)
并得到
I_COL F_COL
---------- ----------
1 1
1 1,1
2 rows selected.
Run Code Online (Sandbox Code Playgroud)
谢谢,节省了很多工作。
短格式int的integer支持,以及。
我不考虑将它用于分区功能。我只想知道,是否支持。
不要告诉我为什么在分区表上使用这样的列不是一个好主意。
我知道要查询数据库的当前兼容级别
declare @dbname sysname
select @dbname = db_name(0)
exec sp_dbcmptlevel @dbname
Run Code Online (Sandbox Code Playgroud)
但这似乎通过打印返回其结果,我发现无法将值分配给变量并使用它来控制 if ... else ... 构造以根据当前设置执行不同的代码。
当我必须调查由 IMPLICIT_TRANSACTIONS ON 引起的问题时,我可以专注于客户端工具设置 IMPLICIT_TRANSACTIONS ON 或 ANSI_DEFAULTS ON 还是可以针对影响所有客户端的整个数据库进行设置?
我可以通过将标准脚本头更改为来避免该问题
SET ANSI_DEFAULTS ON
SET IMPLICIT_TRANSACTIONS OFF
Run Code Online (Sandbox Code Playgroud)
但是这个设置会在哪些级别的会话、数据库、服务器上受到影响呢?
编辑:
似乎可以在服务器级别进行设置。
在“服务器属性”对话框(“连接”页面)中,我发现选项已更改并编写了脚本:
隐式交易:
EXEC sys.sp_configure N'user options', N'2'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)
隐式交易关闭:
EXEC sys.sp_configure N'user options', N'0'
GO
RECONFIGURE WITH OVERRIDE
GO
Run Code Online (Sandbox Code Playgroud)
但执行
exec('dbcc useroptions')
Run Code Online (Sandbox Code Playgroud)
SSMS中没有反映变化。对于此类连接,服务器设置似乎以某种方式被覆盖。
现在我必须重新提出这个问题,
是否有客户端不会覆盖服务器设置,并且在服务器设置更改时可能会崩溃。
在以下示例中,仅使用一个 SQL 查询的第一个版本的性能非常差。问题是最后一次加入。
当我将左侧的结果存储到一个临时表中并加入它时,它的运行速度大约快了 50 倍。
它旨在将其转换为 Oracle,因此我尽量避免使用临时表。
任何解释,为什么第一个查询表现如此糟糕或暗示改进它?
Declare @HO int = 2866;
Declare @Dtz int = 35;
---- version 1 takes about 60 seconds
With ratings as
(
select
ROW_NUMBER() Over ( ORDER BY SEDate) lfd,
SEDate,
BBCode
from PPV
join BB on BBRefnr = SEBBRefnr
where SEHORefnr = @HORefnr
and SEBBRefnr > 0
)
Select
SEDATE,
BBCODE,
Code,
DTRefnr
FROM (
Select
l.SEDate,
l.BBCode,
dbo.GetCode(@Dtz, l.BBCode) Code
from ratings l left join ratings r on l.lfd = …Run Code Online (Sandbox Code Playgroud) 在 SQL Server 中很容易编写:
create table #tmp (
id integer identity(1,1) primary key,
message varchar(256)
);
Run Code Online (Sandbox Code Playgroud)
当我尝试将其迁移到 Oracle 时,我最终得到:
CREATE GLOBAL TEMPORARY TABLE tmp(
id integer primary key,
message varchar2(256)
) ON COMMIT PRESERVE ROWS;
CREATE SEQUENCE S_TMP_ID START WITH 1;
CREATE OR REPLACE TRIGGER TR_TMP
BEFORE INSERT ON tmp
FOR EACH ROW
WHEN (new.id IS NULL)
BEGIN
SELECT S_TMP_ID.NEXTVAL
INTO :new.id
FROM dual;
END;
/
Run Code Online (Sandbox Code Playgroud)
好的。我得到了独特的、不断增加的 id 值。但是,当两个会话同时使用同一个全局临时表时,我的想法序列就会出现差距,并且它们以某个任意值开始。
任何想法如何为全局临时表创建更好的标识值?
将 x 视为包含 null、0、1 的列。只有不到 1% 的行包含 1。0 和 Null 之间没有逻辑差异。
坚持在这里使用 isnull 而不是 NVL 是个好主意吗(性能)?