Sql server 为可读性命名Value子句中的项目
是否有更好的方法将Sql server 为可读性命名Value子句中的项目,sql-server,tsql,Sql Server,Tsql,是否有更好的方法将值中的项映射到列名。我总是通过评论来做到这一点: insert into Table1 (Col1, Col2, ..., Coln) values ('One' /* Col1 */, 'Two' /* Col2 */, ..., 'ValN' /* Coln */); 当涉及到许多列并且values子句中包含查询时,这一点变得尤为重要。我总是要数一数,看看values子句中的哪个项目对应于哪个列。因此,我只使用如上所示的注释。我将陈述一个显而易见的事实,根据查询的不同,有
值中的项映射到列名。我总是通过评论来做到这一点:
insert into Table1 (Col1, Col2, ..., Coln)
values ('One' /* Col1 */, 'Two' /* Col2 */, ..., 'ValN' /* Coln */);
当涉及到许多列并且values子句中包含查询时,这一点变得尤为重要。我总是要数一数,看看values
子句中的哪个项目对应于哪个列。因此,我只使用如上所示的注释。我将陈述一个显而易见的事实,根据查询的不同,有时我可能会将它们放在单独的行中
还有别的办法吗?你的办法不错。我通常每列用一行。它可以很长,但我觉得它更可读。大概是这样的:
insert into Table1 (
Col1
,Col2
,...
,Coln
)
values (
One /* Col1 */
,Two /* Col2 */
,...
,ValN /* Coln */
);
在某些情况下,使用JSON字符串可能很有用。在其他情况下,这可能是杀伤力过大。下面是一个简单的例子:
假设我们有一个名为“test”的表,有两列:“Number”(INT)和“Word”(VARCHAR(40))
我们可以使用以下构造在该表中插入记录:
INSERT INTO test (Number, Word)
SELECT source.Number, source.Word
FROM
(
SELECT Number, Word
FROM
OpenJson('[{
"number": 01, "word": "This"
}, {
"number": 02, "word": "Is"
}, {
"number": 03, "word": "Just"
}, {
"number": 04, "word": "a"
}, {
"number": 05, "word": "Test"
}] '
) WITH (Number INT '$.number', Word VARCHAR(40) '$.word')
) AS source
我们可以看到:
要插入的数据存储在JSON字符串中。然后,我们使用表中相同的列名在JSON字符串中命名每个属性
在执行实际插入时,要插入的值的名称是与其列同名的变量,因此非常可读。(source.Number,source.Word)
在某些情况下,使用JSON字符串不仅可以帮助映射数据及其列,还可以调试数据并找到错误的值。。我正在寻找另一种方法,如果有的话,如问题所示。是的,我刚刚添加了另一种方法,使用JSON字符串作为数据源。在某些情况下,这种方法可以工作,并有助于可读性和调试。@对查询复杂度变量(@)进行编码可以提高可读性/可发现性。明显地在某些情况下,这种方法会使TSQL更加复杂。我同意,我也尝试这样做。通常,如果我迫不及待地想在VALUES
子句中标记项目,因为没有它不清楚,那么我就用SELECT
替换它,而不使用FROM
作为SELECT
中的值列别名。如果有多行,则需要将它们与UNION ALL
组合。类似于Martin的方法INSERT INTO t1(co1,CO2..)从(值('One','Two')中选择*作为D(Col1,col2)代码>使用包装值并提供显式列名。@martinsmith这是一个很好的提示!我一定会用上的。谢谢分享:)