我对我的一项发现感到惊讶,即使用 aFORMAT ()确实对行大小和数据大小有很大影响。它几乎是不应用的大小的 250 倍FORMAT ()。
我的问题是:
1)为什么使用FORMAT()对大小有这么大的影响?对我来说,只有 1.23 美元与 1.23 美元的差异,这可能是 1 个字符的差异。这么大的尺寸有关系吗?
2) 为什么我们仍然鼓励FORMAT()在 SQL Server 中使用而不是使用字符串连接,如下所示。由于下面只有 2 倍的数据大小,使用格式返回 250 倍的数据大小。或者数据大小不是一个关键的衡量标准?
SELECT '$' + CONVERT(varchar(10), UnitPrice) FROM Sales.SalesOrderDetail;
Run Code Online (Sandbox Code Playgroud)
3) 数据大小为 464MB 是否意味着我将向客户端返回 464MB 的数据?
================================================== ======
以下是我对 AdventureWorks2012 数据库的发现。
SELECT UnitPrice FROM Sales.SalesOrderDetail;
Run Code Online (Sandbox Code Playgroud)
实际行
数:121317
估计行数:121317估计行大小:15B
估计数据大小:1777KB
SELECT '$' + CONVERT(varchar (10), UnitPrice) FROM Sales.SalesOrderDetail;
Run Code Online (Sandbox Code Playgroud)
实际行数:121317
估计行大小:26B
估计数据大小:3060KB
SELECT FORMAT(UnitPrice, 'c') FROM Sales.SalesOrderDetail;
Run Code Online (Sandbox Code Playgroud)
实际行数:121317
估计行大小:4011B
估计数据大小:464MB
我们正在实施一个软件,允许在内部用户之间发送“虚拟”资金。我们已经使用如下单个条目启动了我们的数据库(简化表)。我们只记录一笔交易,其中用户发起的交易(汇款)都会被记录下来。所以它永远是一个借方。
TransactionLog
------------------
TransactionLogID
UserIDFrom
UserIDTo
CurrencyID
CurrencyAmount
Remarks
TransactionDateTime
Run Code Online (Sandbox Code Playgroud)
然后需求发生变化,说明我们需要在我们的数据库中使用复式记账模式。然后我做了一个新表如下。
TransactionLogDoubleEntry
----------------------------
TransactionLogDoubleEntryID
TransactionLogID
UserID
CounterPartyUserID
CreditOrDebit
CurrencyID
CurrencyAmount
Remarks
TransactionDateTime
Run Code Online (Sandbox Code Playgroud)
我的问题:
1)我是否 以正确的方向执行此操作,即我添加TransactionLogDoubleEntry带有贷记/借记的表,这意味着它已经成为复式记帐模式?
2)我应该留在桌子上TransactionLog吗?或者使用TransactionLogDoubleEntry就足够了?
3)如果我要留在TransactionLog桌子上,我是否有必要复制currencyID, currencyAmount, remarks, TransactionDateTimein TransactionLogDoubleEntry?或者这足以从TransactionLog表中获取相应的值。
假设我通过从现有表执行分组来选择如下临时表,这是当前的临时表值:
Title Count
-------------
Sr. 11
Mrs. 2
Sra. 3
Ms. 415
Mr. 578
Run Code Online (Sandbox Code Playgroud)
我想要实现的是标题的逗号分隔值,如下所示,按计数排序
[Mrs.], [Sra.], [Sr.], [Ms.], [Mr.]
Run Code Online (Sandbox Code Playgroud)
但是,目前我只能实现以下逗号分隔值,这是#temptable 中的默认排序
[Sr.], [Mrs.], [Sra.], [Ms.], [Mr.]
Run Code Online (Sandbox Code Playgroud)
下面是我的代码。我怎样才能达到我想要的?
注意:在插入#temptable 时,我既不假设也不期望序列已经按顺序排列
DECLARE @Columns as VARCHAR(MAX)
SELECT @Columns =
COALESCE(@Columns + ', ','') + QUOTENAME(Title)
FROM
(
SELECT Title FROM #tempTable1
) AS P
Run Code Online (Sandbox Code Playgroud) 我正在尝试在 sql server 2012 中实现类似的功能。但是这种语法不存在。它有什么替代方案,为什么 sql server 不支持这种语法糖?
这意味着 C1 匹配 D1,C2 匹配 D2,Cn 匹配 Dn。当所有列匹配时,它只会过滤掉结果。
SELECT * FROM tableA
WHERE
([C1], [C2],..., [Cn]) IN (SELECT [D1], [D2],..., [Dn] FROM tableB)
Run Code Online (Sandbox Code Playgroud)