我的公司正面临为新的数据库服务器购买 SQL Server 2012 Denali 还是 SQL Server 2008 R2 的决定。我正在寻找客观的理由来选择一个。
我们的要求:
目前,我知道以下原因:
SQL Server 2012 德纳利
SQL Server 2008 R2
我似乎找不到很多技术原因来偏爱其中一个。基本上,这归结为选择成功运行的成熟技术与可用的最新和最好的版本。
做出决定的客观原因是什么?
sql-server-2008 sql-server sql-server-2008-r2 sql-server-2012
我们经常会遇到“如果不存在,则插入”的情况。Dan Guzman 的博客对如何使此进程线程安全进行了出色的调查。
我有一个基本表,它只是将字符串从SEQUENCE. 在存储过程中,我需要获取该值的整数键(如果它存在),或者INSERT它然后获取结果值。该dbo.NameLookup.ItemName列有一个唯一性约束,因此数据完整性没有风险,但我不想遇到异常。
这不是一个IDENTITY所以我无法获得,SCOPE_IDENTITY并且NULL在某些情况下价值可能是。
在我的情况下,我只需要处理INSERT桌面上的安全问题,所以我试图决定是否使用MERGE这样的方法更好:
SET NOCOUNT, XACT_ABORT ON;
DECLARE @vValueId INT
DECLARE @inserted AS TABLE (Id INT NOT NULL)
MERGE
dbo.NameLookup WITH (HOLDLOCK) AS f
USING
(SELECT @vName AS val WHERE @vName IS NOT NULL AND LEN(@vName) > 0) AS new_item
ON f.ItemName= new_item.val
WHEN MATCHED THEN
UPDATE SET @vValueId = f.Id
WHEN NOT MATCHED BY TARGET THEN
INSERT …Run Code Online (Sandbox Code Playgroud) 假设你有这样的事情:
源表(变量):
Values (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Run Code Online (Sandbox Code Playgroud)
目标表:
Mapping (
LeftId INT NOT NULL,
RightId INT NOT NULL,
CustomValue varchar(100) NULL
)
Run Code Online (Sandbox Code Playgroud)
我想合并Values成Target以下规则:
source.LeftId = target.LeftId AND source.RightId = target.RightId
CustomValueLeftId源,即只能删除记录中涉及到LefId什么,我合并的秒。(最后一条规则很难描述,抱歉!)
来源:
1, 10, foo
1, 11, foo
Run Code Online (Sandbox Code Playgroud)
目标:
1, 10, bar
1, 12, foo
2, 20, car
Run Code Online (Sandbox Code Playgroud)
结果目标:
1, 10, foo (updated)
1, …Run Code Online (Sandbox Code Playgroud)