这是对原始问题的重要编辑,使其更简洁,涵盖现有答案提出的要点......
是否可以在单个事务中对多个表进行多次更改,并仅回滚一些更改?
在下面的TSQL中,我不希望回滚"myLogSP"所做的任何更改.但是,如果需要,各种myBusinessSP所做的所有更改都应该回滚.
BEGIN TRANSACTION
EXEC myLogSP
EXEC @err = myBusinessSPa
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPb
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
EXEC @err = myBusinessSPc
IF (@err <> 0) BEGIN ROLLBACK TRANSACTION RETURN -1 END
EXEC myLogSP
COMMIT TRANSACTION
RETURN 0
Run Code Online (Sandbox Code Playgroud)
顺序很重要,myLogSPs必须在myBusinessSPs之间和之后发生(myLogSPs接受myBusinessSPs所做的更改)
同样重要的是,所有myBusinessSP都发生在一个事务中以维护数据库完整性,并允许所有更改在必要时回滚.
就好像我希望myLogSP的行为就好像它们不是交易的一部分.这只是一个不方便的事实,它们碰巧在一个内部(由于需要在myBusinessSP之间调用.)
编辑:
最终答案是"不",唯一的选择是重新设计代码.要么使用表变量进行日志记录(因为变量不会被回滚),要么将业务逻辑重新设计为不需要事务...
sql locking transactions sql-server-2005 transaction-isolation
大家认为什么是SQL中有时间限制的层次结构的最佳表示?
我的意思是:
- 在任何给定的日期,你有一个普通的树层次结构
- 这个层次结构可以从一天到
另一个变化- 每个孩子在任何给定的日期仍然只有一个父
第1天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
| |-Doc(*)
|
|-Moe
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
第2天......
Business
|
|-Joe
| |-Happy
| |-Sneezy
|
|-Moe
|-Doc(*)
|-Bashfull
|-Sleepy
Run Code Online (Sandbox Code Playgroud)
孩子可以在任何时候第一次加入层次结构,或者完全离开层次结构.(例如,新员工和退休员工.)
主要考虑因素:
我知道我现在是怎么做的,但我对其他人怎么做可能很感兴趣:)
编辑
我天真地假设了一些考虑,所以会更明确......
通用性质是最重要的(仅形成通用关系模式的一部分),结合易于使用的驱动报告(对于任何日期范围的树的任何部分)以及可靠更新的能力.
我有一种情况,我已经用两种不同的方式解决了这个问题,但是想知道人们对选项的看法,以及他们是否还有其他选择......
系统正在处理数据的"间隔".
SQL查询中需要以下规则...
模式0
如果记录条目在事实表中,则可以对其进行处理.
(无限制.)
模式1
如果"interval_start"过去,则记录仅对处理有效.(已经开始的时间间隔,但不一定完成.)
模式2
如果整个"间隔"是过去的,则记录仅对处理有效.(已完成的时间间隔.)
为此创建的第一个WHERE子句如下......
WHERE
getDate() >=
CASE [table].mode
WHEN 0 THEN 0
WHEN 1 THEN [log].interval_start
WHEN 2 THEN [log].interval_start + [table].interval_period
ELSE NULL
END
Run Code Online (Sandbox Code Playgroud)
有人担心这会使索引混淆优化条款.另一种方法是使用多个AND/OR条件.
WHERE
([table].mode = 0 AND getDate() >= 0)
OR ([table].mode = 1 AND getDate() >= [log].interval_start)
OR ([table].mode = 2 AND getDate() >= [log].interval_start + [table].interval_period)
Run Code Online (Sandbox Code Playgroud)
显然,哪个表现最好将取决于数据和索引等.但是,是否有人对我目前描述的"条件条件"有任何选择或替代方案?:)
干杯,垫子.
在stackoverflow的这个问题中,接受的答案涉及多次重复相同的代码片段.根据我的经验,许多人努力通过各种方式以各种方式封装代码片段来减少这种情况;
- 可维护性(更改的地方更少)
- 可读性(一次读取代码,然后每次都是"别名")
- 等等
使用链接问题中的代码,您将如何开始减少相同代码片段的重复?或者你会原样离开吗?
(不使用替代逻辑,但坚持使用REPLACE等,只是改变相同逻辑的现状.)
Select Case
When CharIndex('.', Replace(URL, 'www.','')) > 0 then
Left(Replace(URL, 'www.',''), CharIndex('.',Replace(URL, 'www.',''))-1)
Else
Replace(URL, 'www.','')
End as [CleanURL]
From dbo.YourTable
Run Code Online (Sandbox Code Playgroud)
(接受的答案已更改,因此我将代码示例复制到此处.)
编辑
只是为了澄清,我认为我已经引起了混乱.
这不是:
- 如何封装这整段代码以便重复使用?
但它更确切地说:
- 如何减少这段代码中的冗余?
我正在进行从SQL Server 2005到2008迁移数据库的项目.
在测试过程中,我发现了一个不一致 按照BOL http://msdn.microsoft.com/en-us/library/ms186862(v=SQL.100).aspx(2008)和http://msdn.microsoft.com/en-us/library/ ms186862(v = SQL.90).aspx(2005)返回varchar.到目前为止两者都是一样的.但是如果我们传递给REPLACE函数列类型char则会出现差异.看看这段代码
declare @test table
(
testcharstring char(25)
)
insert into @test
select 'Hello'
union
select 'World'
union
select 'Hello world '
select
'"'+testcharstring+'"' as original
,'"'+replace(testcharstring,'a','A')+'"' as afterreplace
--,'"'+replace(rtrim(testcharstring),'a','A')+'"'
from @test
Run Code Online (Sandbox Code Playgroud)
SQL Server 2005的结果
original afterreplace
--------------------------- ---------------------------
"Hello " "Hello"
"Hello world " "Hello world"
"World " "World"
Run Code Online (Sandbox Code Playgroud)
SQL Server 2008的结果
original afterreplace
--------------------------- ---------------------------
"Hello " "Hello "
"Hello world " …Run Code Online (Sandbox Code Playgroud) 在此先感谢您的回答,并为我的英语不好对不起,我不是母语人士。
我们实际上是在开发带有后端的手机游戏。在此手机游戏中,我们有一个货币系统,我们会跟踪每笔交易以进行验证。
为了读取用户余额,我们有一个中间表,该表中的每笔交易都会更新用户余额,因此用户永远不会直接读取交易表,以减轻高流量的负担。
事务表在后台不时地唯一读取。
这是事务表的架构:
create table money_money_transaction (
`id` BIGINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
`userID` INT UNSIGNED NOT NULL,
`amount` INT NOT NULL,
`transactionType` TINYINT NOT NULL,
`created` DATETIME NOT NULL,
CONSTRAINT money_money_transaction_userID FOREIGN KEY (`userID`) REFERENCES `user_user` (`id`)
ON DELETE CASCADE
);
Run Code Online (Sandbox Code Playgroud)
我们计划有很多用户,交易表可能会增长到10亿行,所以我的问题是:
我有以下数据框
\nprint(A)\n\n Index 1or0\n0 1 0\n1 2 0\n2 3 0\n3 4 1\n4 5 1\n5 6 1\n6 7 1\n7 8 0\n8 9 1\n9 10 1\nRun Code Online (Sandbox Code Playgroud)\n我有以下代码(Pandas Dataframe 计算仅立即发生的出现次数),它计算一个接一个立即发生的值的出现次数。
\nser = A["1or0"].ne(A["1or0"].shift().bfill()).cumsum()\n\nB = (\n A.groupby(ser, as_index=False)\n .agg({"Index": ["first", "last", "count"],\n "1or0": "unique"})\n .set_axis(["StartNum", "EndNum", "Size", "Value"], axis=1)\n .assign(Value= lambda d: d["Value"].astype(str).str.strip("[]"))\n )\n\nprint(B)\n\xe2\x80\x8b\n StartNum EndNum Size Value\n0 1 3 3 0\n1 4 7 4 1\n2 8 8 1 0\n3 9 10 2 1\nRun Code Online (Sandbox Code Playgroud)\n问题是,当出现 NaN 值时,代码不会将它们放在一个间隔中,而是始终将它们计数为一个大小的间隔,而不是例如 3 …
我有一个大型SQL数据库,我需要验证表和列的结构(而不是数据本身).所以我需要生成所有表的列表,然后为每个表生成所有列,然后为每个列生成其数据类型,长度/精度,序号位置,以及它是否是该表的主键的一部分.
我可以通过以下查询获得我需要的大部分内容:
SELECT TABLE_NAME, ORDINAL_POSITION, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, NUMERIC_SCALE
FROM INFORMATION_SCHEMA.COLUMNS
Run Code Online (Sandbox Code Playgroud)
但是,我不确定如何检查列是否是主键的一部分.另外,对于那些PK由多个列组成的表,我想知道键中每列的序号位置.到目前为止我发现的信息与设置密钥而不是读取密钥有关.
我有兴趣在SQL Server和Oracle中执行此操作.
假设我有2个表,查询和排名.我想知道是否有可能在排名表中找到每个查询的最小值之和?
只有当用户单击特定查询的结果时,才会输入排名表.
rank(id,key,value)查询(id,key,value)
其中rank.id = query.id
5个条目的快照
rank table
-------------
Twp0+x1uZx1Y| Twp1PK8JWhng| 16
Twp1KU6Pgxp4| Twp1VAF0jRyI| 5
Twp2KuoJWR-8| Twp2OR5X7h78| 1
Twp354EADhYY| Twp4AQlqjxWg| 2
query table
------------
Twp0+x1uZx1Y| |sap
Twp0-XWZ3gpk| |
Twp1CIP+oh-Q| |
Twp1KU6Pgxp4| |virtual token
Twp14RxuSBzc| |
Run Code Online (Sandbox Code Playgroud) 我需要将一些数据从SAS导出到CSV,以便我可以将其移动到SQL Server并将其加载到那里.(服务器无法看到对方.)
在数据中是一个具有以下定义的字段:
现在我只想看看日期范围内有多少条记录:
proc sql;
SELECT COUNT(*)
FROM BNA_BASE.base_agent_bna_cust_date
WHERE bna_outcome_ts >= '04Jun12:00:00:00'd
AND bna_outcome_ts < '11Jun12:00:00:00'd
;
quit;
Run Code Online (Sandbox Code Playgroud)
但我总是得到0,即使我在表中可以看到有记录符合我认为我正在查询的记录,例如06JUN12:12:42:57.
有谁可以指出我的愚蠢错误?
sql ×8
sql-server ×3
database ×2
coding-style ×1
conditional ×1
dataframe ×1
date ×1
hierarchy ×1
locking ×1
min ×1
mysql ×1
optimization ×1
oracle ×1
pandas ×1
python ×1
replace ×1
reporting ×1
sas ×1
sqlite ×1
t-sql ×1
transactions ×1