如何像数组一样访问表数据类型?

Gou*_*pal 1 sql-server sql-server-2016

我试图将数据存储在一个表变量中@coordinates,该变量包含 2 行和 2 列:纬度和经度。

存储价值:

declare @coordinates table(latitude decimal(12,9), longitude decimal(12,9)) 
insert into @coordinates select latitude, longitude from loc.locations where place_name IN ('Delhi', 'Mumbai')
Run Code Online (Sandbox Code Playgroud)

查看值:

select * from @coordinates
Run Code Online (Sandbox Code Playgroud)

结果:

latitude    longitude
28.666670000    77.216670000
19.014410000    72.847940000
Run Code Online (Sandbox Code Playgroud)

但我想一一访问这些值,例如:@coordinates[1][1] 或 @coordinates.latitude[1]

或任何可能的简单方法?

And*_*y M 5

while@coordinates是一个变量,它是一个变量,而不是一个数组。访问存储在表变量中的数据的方式与访问常规表中的数据相同,即使用查询。

现在,当您想要检索表特定行的数据时,您需要一种引用该行的方法。通常您使用某种 ID 列。在这种情况下,您可以在@coordinates声明中添加这样的列:

declare @coordinates table
(
  id int identity (1,1),
  latitude decimal(12,9),
  longitude decimal(12,9)
);
Run Code Online (Sandbox Code Playgroud)

id列被声明为 IDENTITY 列,并将在行添加到 时自动填充@coordinates。所以现在运行你的 INSERT 语句后,内容将如下所示:

declare @coordinates table
(
  id int identity (1,1),
  latitude decimal(12,9),
  longitude decimal(12,9)
);
Run Code Online (Sandbox Code Playgroud)

为了检索,比如说,latitude从第 1 行,你会做

SELECT latitude FROM @coordinates WHERE id = 1;
Run Code Online (Sandbox Code Playgroud)

如有必要,您可以在适当的情况下将其用作标量表达式,例如:

SELECT
  some_columns,
  (SELECT latitude FROM @coordinates WHERE id = 1) + another column AS some_alias
FROM
  some_table
WHERE
   ...
Run Code Online (Sandbox Code Playgroud)

诚然,这并不像 那样漂亮@coordinates.latitude[1],但它是在 SQL 中处理数据的传统方式。

但是请注意,如果您需要在涉及其他表的查询中检索此表的内容,并且行 ID 将取决于某些表的列,则连接 @coordinates到相应的表会更自然:

SELECT
  ...
  c.latitude + t.some_other_column AS whatever
FROM
  some_table AS t
  INNER JOIN @coordinates AS c ON t.some_column = c.id
WHERE
  ...
Run Code Online (Sandbox Code Playgroud)