Sql server 执行STUFF return查询字符串而不将其存储到变量中
我正在使用Sql server 执行STUFF return查询字符串而不将其存储到变量中,sql-server,tsql,sql-server-2012,Sql Server,Tsql,Sql Server 2012,我正在使用STUFF函数准备select查询 鉴于: DECLARE @GeoID VARCHAR(MAX) = '1,2,3,4' DECLARE @TableName VARCHAR(100) = 'Table1' SELECT STUFF((SELECT ' UNION ALL SELECT t.* FROM ['+@TableName+'] t WHERE ( Select GeoPath from dbo.TableGeo Where GeoID = '''+f.Item+''').
STUFF
函数准备select
查询
鉴于:
DECLARE @GeoID VARCHAR(MAX) = '1,2,3,4'
DECLARE @TableName VARCHAR(100) = 'Table1'
SELECT STUFF((SELECT ' UNION ALL SELECT t.* FROM ['+@TableName+'] t WHERE ( Select GeoPath from dbo.TableGeo Where GeoID = '''+f.Item+''').STIntersects(geometry::Point(ISNULL(Lat,''''), ISNULL(Long,''''),4326))=1'
FROM f_Split(@GeoID,',') f
FOR XML PATH('')),1,11,'')
在这里,我想执行
选择union all
查询,而不将其存储到变量中,然后执行。当您将内置的自定义拆分函数切换到最新版本的SQL Server时,代码会起作用:
DECLARE @GeoID VARCHAR(MAX) = '1,2,3,4'
DECLARE @TableName VARCHAR(100) = 'Table1'
SELECT STUFF((SELECT ' UNION ALL SELECT t.* FROM ['+@TableName+'] t WHERE ( Select GeoPath from dbo.TableGeo Where GeoID = '''+f.value+''').STIntersects(geometry::Point(ISNULL(Lat,''''), ISNULL(Long,''''),4326))=1'
FROM string_split(@GeoID,',') f
FOR XML PATH('')),1,11,'')
“在这里,我希望执行select union all查询,而不将其存储到变量中,然后执行。”您不能;创建动态语句时,必须首先将其放入变量中,因为无法将表达式传递给参数(包括
@stmt
)。另外,您确实需要解决您的注射问题<代码>'.['+@TableName+'].'不安全。如果@TableName
的值为:'sys].[tables],您认为会发生什么;下表1;——'代码>?您不是在执行一个STUFF查询,而是在使用XML技术连接一个刚刚拆分的字符串。你想干什么?您想要解决的实际问题是什么?您试图从该连接中产生什么?例如,此查询中只有一个表,为什么要使用UNION ALL?如果你想搜索特定的大地水准面,为什么不在
子句中使用一个?@MAK我认为这个代码太复杂了,它应该做什么都看不见了。为什么
中的与STIntersects
有关?它将GeoID
与'1,2,3,4'
中的值进行比较。本质上,它是(1,2,3,4)
中一个昂贵的大地水准面,存在SQL注入问题。对于STIntersects
,尝试使用可能包含空值的单个点。当它不抛出时,速度会非常慢。@MAK您可以编写选择t.*从该表t内部连接表GEO g在t.ThatPoint.与(1,2,3,4)中的GeoID相交(g.GeoPath)
。该点应该是索引所涵盖的实际地理列,以获得任何性能优势。但是,点与开放路径相交的几率基本上为0,除非它与路径的一个节点完全匹配。如果路径不包含开放路径,STContains
会更好。至少要解决巨大的注入问题。此外,OP明确标记了sql-server-2012
<代码>字符串分割
在2012年不存在。