Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 执行STUFF return查询字符串而不将其存储到变量中_Sql Server_Tsql_Sql Server 2012 - Fatal编程技术网

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年不存在。