请考虑SQL Server 2008中的下表:
LanguageCode varchar(10)
Language nvarchar(50)
Run Code Online (Sandbox Code Playgroud)
LanguageCode参与关系,因此我无法创建包含两列(LanguageCode,Language)的主键索引.
如果我在LanguageCode上放置一个主群集密钥,当然我不能在索引中包含语言(覆盖索引).这意味着我将不得不为Language创建第二个索引,或者冒着在其中包含重复项的风险(加上强制执行表扫描以检索其值).
此外,MS的文档(以及该主题的专家)表明理想情况下表应具有聚簇索引.
在这种情况下,非聚集覆盖索引(LanguageCode,Language)不仅可以确保语言是唯一的,而且可以避免表扫描.但是,没有"理想的"聚集索引.
这种没有聚集索引的情况实际上是理想的吗?
根据反馈进行修改:
我希望运行的唯一查询是:
SELECT Language, LanguageCode FROM Languages where Language="EN"
Run Code Online (Sandbox Code Playgroud) 我需要知道MERGE语句是否执行了INSERT.在我的场景中,插入是0或1行.
测试代码:
DECLARE @t table (C1 int, C2 int)
DECLARE @C1 INT, @C2 INT
set @c1 = 1
set @c2 = 1
MERGE @t as tgt
USING (SELECT @C1, @C2) AS src (C1, C2)
ON (tgt.C1 = src.C1)
WHEN MATCHED AND tgt.C2 != src.C2 THEN
UPDATE SET tgt.C2 = src.C2
WHEN NOT MATCHED BY TARGET THEN
INSERT VALUES (src.C1, src. C2)
OUTPUT deleted.*, $action, inserted.*;
SELECT inserted.*
Run Code Online (Sandbox Code Playgroud)
最后一行不编译(没有范围,不像触发器).我无法访问@action或输出.实际上,我不想要任何输出元数据.
我怎样才能做到这一点?
我需要使用 HSTORE 类型和键索引来存储数据。
CREATE INDEX ix_product_size ON product(((data->'Size')::INT))
CREATE INDEX ix_product_color ON product(((data->'Color')))
etc.
Run Code Online (Sandbox Code Playgroud)
使用表达式索引有哪些实际限制?就我而言,可能有数百种不同类型的数据,因此有数百种表达式索引。每个插入、更新和选择查询都必须针对这些索引进行处理,以便选择正确的索引。
我有一个T4 C#文件,我需要在静态类中引用一个常量.静态类位于同一名称空间中.
这可能吗?
以下仅仅是一个例子.我需要根据现有常量计算实际常量,但也需要调用扩展方法.为了简单起见,我只是在说明这个概念.
.cs文件:
namespace me
{
public static class Stat
{
public const int Const = 1;
}
}
Run Code Online (Sandbox Code Playgroud)
.tt文件:
...
namespace me
{
public static int Test
{
return <#= Stat.Const #>;
}
}
Run Code Online (Sandbox Code Playgroud) 使用VBROADCASTS命令在AVX中很容易,如果值是double或float,则在SSE中很容易.
如何向Delphi ASM中的XMM寄存器中的每个插槽广播一个8位值?
在我的阅读中,我在SQL Server存储过程的CATCH部分中看到了两种处理事务回滚的方法:
1: if @@trancount > 0 ROLLBACK
2: if XACT_STATE() <> 0 ROLLBACK TRAN
Run Code Online (Sandbox Code Playgroud)
哪个更好?为什么?
在 SQL Server 2008 中,我知道没有嵌套事务这样的东西。这些似乎只是存在。我也知道一些专家强烈恳求开发人员不要使用可用的伪嵌套事务。例如,这里。
但是,我有一个案例,我需要在特定嵌套过程中的一行上使用 XLOCK,但仅限于该过程的持续时间。它必须是那个锁,我显然想尽快放下锁。在伪代码中:
...outer procedure
BEGIN TRAN Inner
EXEC InnerProcedure
...InnerProcedure...
BEGIN TRAN Inner
SELECT ... WITH (XLOCK, ROWLOCK)
COMMIT TRAN Inner
-- NEVER rollback here; get the outer procedure to do this
...End InnerProcedure...
COMMIT TRAN Outer
Run Code Online (Sandbox Code Playgroud)
我的问题是:
我编写了这个函数来将单例转换成整数:
function Round(const Val: Single): Integer;
begin
asm
cvtss2si eax,Val
mov Result,eax
end;
end;
Run Code Online (Sandbox Code Playgroud)
它有效,但我需要改变舍入模式.显然,按此,我需要设置MXCSR寄存器.
我如何在Delphi中执行此操作?
我之所以这样做的原因是我需要"远离零"舍入(就像在C#中一样),即使通过SetRoundingMode也是如此.
以下内容无法编译:
and rax, $7FFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
我已经尝试将值设为常量,甚至将其作为qword投射,但编译器会抛出"dword值超出界限".
当然,这是一个qword,而不是dword.如何让编译器实现这一点?
请注意,64位代码正在编译并正确运行.
我有最新的Lazarus版本.
这个 SQL:
select to_timestamp(extract(epoch from '0001-01-01 00:00:00'::timestamp))
Run Code Online (Sandbox Code Playgroud)
产生这个输出:
0001-01-01 08:06:00+08:06
我意识到to_timestamp()总是添加一个时区,因此额外的 8 小时和+8时区部分。但什么是:06?额外的 6 分钟从哪里来?
编辑
如果我最初执行,set local timezone to 'UTC';那么我会得到预期的结果。
postgresql timestamp timezone-offset timestamp-with-timezone postgresql-9.6
sql-server ×4
assembly ×2
delphi ×2
delphi-7 ×2
indexing ×2
postgresql ×2
sse ×2
transactions ×2
basm ×1
c# ×1
expression ×1
freepascal ×1
lazarus ×1
locking ×1
rounding ×1
scope ×1
sql ×1
t-sql ×1
t4 ×1
timestamp ×1
x86-64 ×1