鉴于以下代码段:
-- error checking omitted for brevity
begin tran
exec database1..my_stored_procedure
exec database2..my_other_stored_procedure
if (@@error <> 0)
rollback
commit
Run Code Online (Sandbox Code Playgroud)
事务信息将插入到哪个数据库的事务日志中?
我希望两个日志都能获得所有数据,因为如果您尝试重放database1事务日志并且它只影响该数据库,那将毫无意义。我还希望您无法database1在database2不存在的服务器上重放的事务日志,反之亦然。
.. 但我愿意接受更正!
考虑以下 sproc:
create or alter procedure TestSproc
as
begin
declare @ZeroBit bit = 0, @OneBit bit = 1
-- Table.Id is a nullable integer column
select iif(Table.Id is null, @ZeroBit, @OneBit) as ColumnNotNull
end
Run Code Online (Sandbox Code Playgroud)
编译完成后,运行以下命令:
select name, system_type_name, is_nullable
from sys.dm_exec_describe_first_result_set_for_object(object_id('TestSproc'), 0)
Run Code Online (Sandbox Code Playgroud)
显示ColumnNotNull正确键入为 a的列bit,但它可以为 null。
可空性对我来说没有意义,因为我传递给的参数iif是非空常量,那么为什么结果列可以为空?是否有可能让它不可为空而不用包装表达式isnull来解决这个问题,在我看来这是 - 或者更确切地说,应该是 - 不必要的?
的文档iif没有提到可空性,只是说明此函数“从 true_value 和 false_value 中的类型中返回具有最高优先级的数据类型”。
考虑以下表达式,它从日期时间值截断(不舍入)毫秒数:
declare @now datetime2 = sysdatetime();
select @now;
select convert(datetime2, convert(varchar(20), @now, 120));
-- Output
2021-07-30 09:38:33.5566666
2021-07-30 09:38:33.0000000
Run Code Online (Sandbox Code Playgroud)
请注意varchar(20). 我不喜欢那个特定的长度值,因为如果我应该更改我的数据类型,可能会丢失数据:
declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(20), @now, 120));
-- Output
2021-07-30 02:39:12.7200000 -07:00
2021-07-30 02:39:12.0000000 +00:00 -- oops, we lost the time zone too!
Run Code Online (Sandbox Code Playgroud)
因此,我更愿意使用以下内容:
declare @now datetimeoffset = sysdatetimeoffset() at time zone 'Pacific Standard Time';
select @now;
select convert(datetimeoffset, convert(varchar(max), @now, 120)); -- note …Run Code Online (Sandbox Code Playgroud)