我经常需要在 SQL Server 2008 中的列上执行字符串连接或几何联合,我知道您可以在 .NET 中编写自定义聚合函数并在 SQL Server 中注册它们来执行这些操作。
但是,您可以采用一种非常简单的方法来解决问题,使用局部变量和选择,例如
CREATE TABLE Test(
ID int IDENTITY(1,1) NOT NULL PRIMARY KEY,
geom geometry NOT NULL,
attribute nvarchar(max) NOT NULL,
)
GO
INSERT INTO Test(geom, attribute)
VALUES ('POLYGON ((0 0, 1 0, 2 2, 0 0))', 'shape1'),
('POLYGON ((0 0, 0 1, 2 2, 0 0))', 'shape2'),
('POLYGON ((2 2, 3 2, 3 3, 2 3, 2 2))', 'shape3')
GO
-- string concatenation
DECLARE @mytext nvarchar(MAX) = '';
SELECT @mytext = @mytext + ' ' + attribute
FROM Test;
SELECT @mytext;
-- geometry union
DECLARE @mygeom geometry = 'POLYGON EMPTY';
SELECT @mygeom = @mygeom.STUnion(geom)
FROM Test;
SELECT @mygeom;
除了空值等,这些似乎工作正常。所以我不明白为什么在大多数文章中根本不建议使用这些方法。
像这样计算聚合值有什么问题?
非常感谢。
.NET
与(例如您可以使用 a 的地方)相比,TSQL 对于字符串操作的效率非常低StringBuilder
。串联方法将分配一整套新字符串。如果您可以预先创建一个大字符串并用于
STUFF
替换它的一部分,那可能不会那么糟糕,但我相信从之前尝试这种方法来看,这也只是在幕后创建一个新字符串。此外,您在这两种情况下所依赖的行为都没有记录并且无法保证。“聚合串联查询的正确行为未定义。”