是否有相当于
CHECKSUM_AGG(CHECKSUM(*))
Run Code Online (Sandbox Code Playgroud)
对于哈希字节?
我知道你能做到
SELECT
HashBytes('MD5',
CONVERT(VARCHAR,Field1) + '|'
+ CONVERT(VARCHAR,Field2) + '|'
+ CONVERT(VARCHAR,field3) + '|'
)
FROM MyTable
Run Code Online (Sandbox Code Playgroud)
但我不确定如何将所有计算出的哈希字节记录聚合为 SQL 内的单个值。
我想要这样做的原因之一是在将数据移动到我的系统之前确定自上次加载以来源表中的数据是否已更改。
运行下面的代码,我认为$CONST_HASH无法编辑。
Set-Variable -Name CONST_HASH -Value @{a=1} -Option Constant
Run Code Online (Sandbox Code Playgroud)
如果我尝试重置变量,它会失败
$CONST_HASH2 = @{}
Run Code Online (Sandbox Code Playgroud)
但我可以附加或编辑其值。
$CONST_HASH.A = 10
$CONST_HASH.B = 2
Run Code Online (Sandbox Code Playgroud)
有办法防止这种情况吗?
我想使用内置函数,但目标对象位于不同的数据库中。
例子
------------------------------------
USE TestDB_1
GO
SELECT OBJECT_DEFINITION('SOME OBJECT')
UNION
SELECT TestDB_2.SYS.OBJECT_DEFINITION('SOME OBJECT')
------------------------------------
Run Code Online (Sandbox Code Playgroud)
我知道我可以引用 sys.sql_modules 来获取对象定义,我一般要求任何内置的 sql 函数,如 db_name() 等。
我正在尝试获取类似于以下内容的 PSObject 数组
@{BakId=27; Name=DB_A; Lsn=123; File=A_01; Size=987}
@{BakId=28; Name=DB_B; Lsn=456; File=B_01; Size=876}
@{BakId=28; Name=DB_B; Lsn=456; File=B_02; Size=765}
@{BakId=28; Name=DB_B; Lsn=456; File=B_03; Size=654}
Run Code Online (Sandbox Code Playgroud)
并创建一个新的分组对象,删除冗余的标头信息。
BakId Lsn Name Files
27 123 DB_A {@{File=A_01.bak;Size=777}}
28 456 DB_B {@{File=B_01.bak;Size=888}, @{File=B_02.bak;Size=999}, ...}
Run Code Online (Sandbox Code Playgroud)
我尝试使用组对象,但只能让它适用于一个属性。(所有分组属性都以逗号分隔值的字符串形式进入 Group.Name。)
这是我想到的最好的,但感觉很老套。
$list | Group-Object -Property BakId | % {
$BakId = $_.Name
$Lsn = $_.Group[0].Lsn # <--- is there a better way than this?
$Name = $_.Group[0].Name # <--- Ditto
$Files = $_.Group | Select-Object -Property SequenceNumber, Size
Write-Output (New-Object …Run Code Online (Sandbox Code Playgroud)