受管理层鼓励编写 SQL Server 存储过程的 C# 开发人员经常会产生这样的过程
create table #t1 (...);
insert into #t1 Select ... from table_a where ...;
insert into #t1 Select ... from table_b where ...;
update #t1 Set ... = ... where ...
Select * from #t1;
Run Code Online (Sandbox Code Playgroud)
单个语句相当简单,这种方法使它们产生正确的结果。
我的任务通常是将这些过程迁移到 Oracle。
让我们面对以下事实。
我从 Oracle dba 那里学到的一件事是尽可能避免使用临时表。甚至 SQL 服务器上的性能也受益于此类修改。
用联合替换单个刀片
在最简单的情况下,上面的可以转换成类似
select case when ... then ... end, ... from table_a where ...
union
select case when ... then ... end, ... from table_b …Run Code Online (Sandbox Code Playgroud) 我在 SQL Server 2008 上有一个数据库,我想删除它。目前它处于单用户模式并且正在使用中。
select * from sys.sysprocesses
Run Code Online (Sandbox Code Playgroud)
返回
Msg 924, Level 14, State 1, Line 1
Database 'G_MAIN_DE' is already open and can only have one user at a time.
Run Code Online (Sandbox Code Playgroud)
我不知道如何识别我必须杀死的会话。
尝试将其设置为离线
ALTER DATABASE G_MAIN_DE SET OFFLINE WITH ROLLBACK IMMEDIATE
Run Code Online (Sandbox Code Playgroud)
产量
Msg 5064, Level 16, State 1, Line 1
Changes to the state or options of database 'G_MAIN_DE' cannot be made at this time. The database is in single-user mode, and a user is currently connected to it. …Run Code Online (Sandbox Code Playgroud) 多年前,写
where exists (Select * from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)
去年我注意到许多 t-sql 脚本切换到使用数字 1 而不是星号
where exists (Select 1 from some_table where some_condition)
Run Code Online (Sandbox Code Playgroud)
WHERE EXISTS (SELECT NULL FROM ...
Run Code Online (Sandbox Code Playgroud)
这是 Oracle 的常见模式吗?哪些是使用这样的东西的性能参数。
在 sql*plus 中执行时,以下两个查询似乎是等效的:
1.
select * from user_tables;
Run Code Online (Sandbox Code Playgroud)
2.
select * from user_tables
/
Run Code Online (Sandbox Code Playgroud)
两个版本有什么区别吗?
我的 Oracle 数据库中有一个表,其中
select pkcol, count(*) from myTable group by pkcol having count(*) > 1;
Run Code Online (Sandbox Code Playgroud)
产量
PKCOL COUNT(*)
------- ----------
1 2
2 2
Run Code Online (Sandbox Code Playgroud)
试图删除重复的行
delete myTable where pkcol = 1;
Run Code Online (Sandbox Code Playgroud)
产量:
ORA-01502: 索引“MYTABLE.PK_MT”或此类索引的分区处于可用状态。
我正在使用 Oracle.DataAccess.Client.OracleBulkCopy 来填充表格。
据我了解,必须检查Oracle PRIMARY KEY 约束的文档。
显然它们没有被检查,正如我通过连续两次执行相同的批量复制而发现的,这些批量复制以所有行中的重复结束。
现在我只在删除所有行后才使用它,并且我正在使用一个具有类似主键的表作为源。因此,我预计不会有任何问题。
但是深深嵌入到我的 MS Build 脚本中,我最终在 2210 行中只有 2 个重复。
我想首先忽略主键是一个明显的错误。不允许批量复制忽略主键约束。
编辑:
同时我发现,在调用bulkcopy之前,通常由某个脚本插入的2个冲突行。问题归结为我的已知问题,bulkcopy 不会在这里检查主键。
发现后,我最好将主键从非集群更改为集群。比照有关标识列的聚集索引这个问题,下一步就是如何在prcatical的方式做到这一点。
我很惊讶我没有在 SO 上找到这个问题。
在我的表之间有参考引用,我不能简单地做
if object_id('MyChild') > 0 drop table MyChild
if object_id('Mytable') > 0 drop table Mytable
create table Mytable(
id int Not NULL
)
go
create table MyChild(
id int Not NULL,
masterid int NULL
)
go
alter table Mytable add constraint PK_Mytable primary key (id)
alter table MyChild add constraint FK_MyChild_MyTable foreign key (masterid) references Mytable(id)
go
-- Now I want to change the primary key into a clustered primary key
-- this throws …Run Code Online (Sandbox Code Playgroud) 尝试使用 SQL Developer 的 SQL Tuning Advisor 时,出现此错误。
几天前调优顾问正在工作。

在我的桌面上,我在不同的家中安装了 Oracle 客户端和 Oracle ODAC。我需要 ODAC,因为客户端安装中的 ADO 组件无法正确处理 CLOB 数据。
我想我不能没有客户端安装,因为我需要一些 odbc 组件。
现在我必须维护 tnsnames.ora 文件的副本。我知道要做的事情是小心地保持两个 tnsnames.ora 同步。
对于这样的场景有更好的解决方案吗?
在 SQL-Server 2005 上将 cmptlevel 设置为 80 会禁止使用 PIVOT 和 APPLY,但不会影响分析函数的使用。这背后有什么道理吗?
在数据库上,我必须执行以下两条语句:
GRANT CREATE ANY TABLE TO MyUSER;
GRANT DROP ANY TABLE TO MyUSER;
Run Code Online (Sandbox Code Playgroud)
我想念的是告诉我这些赠款已提供的查询。我没有看到他们
select * from USER_TAB_PRIVS ORDER BY 2 ;
select * from USER_ROLE_PRIVS ORDER BY 1, 2;
Run Code Online (Sandbox Code Playgroud)