SQL 存储过程如何修改和 Return 执行动态查询的结果
SQL Stored Procedure How to Modify and Return the Result of an Executed Dynamic Query
我创建了一个存储过程,其中 returns 一个字符串的串联字段。问题是其中一些字段可能是空字符串,导致字符串很像下面这样:
, Mendip Road, Farnborough, Hampshire, GU14 9LS
甚至
, , Farnborough, Hampshire, GU14 9LS
我真的很想去掉所有前导逗号,但只有在执行查询后我才会知道这一点。有没有一种方法可以执行查询,对逗号进行模式匹配,然后在最终返回修改后的字符串之前将其删除?
查询本身如下:
SET @SQLQuery = 'SELECT TOP 1 REPLACE((ISNULL(POI,'''') + '', '' + ISNULL(Name,'''') + '', '''
+ ' + ISNULL(Settlement,'''') + '', '' + ISNULL(Cou_Unit,'''') + '', '' + ISNULL(Postcode,'''')),'', , '', '', '')'
+ ' AS ClosestAddress FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY '
+ ' (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' * (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' + (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') * (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') ASC'
EXECUTE(@SQLQuery)
您可以执行类似将所有逗号替换为 space 的操作,然后执行 LTRIM 和 RTRIM 并将所有 space 替换为逗号。
Create table Data(name varchar(10),lastname varchar(10));
insert into Data values('','Doe');
insert into Data values('Jane','Doe');
insert into Data values('Jane','');
SELECT Replace(Rtrim(Ltrim(Replace(ISNULL(name,'') +',' + ISNULL(lastname,'') + ',',',',' '))),' ',',')
from Data
我不知道您是否出于其他原因需要动态 SQL,但我认为这样的事情应该可行(没有动态 SQL);如果你真的确定你出于其他原因需要 Dynamic SQL,那么只需将这个想法重构到你的 Dynamic Statement 中:
DECLARE @ClosestAddress VARCHAR(1000)
SELECT TOP 1
@ClosestAddress = ISNULL(POI + ', ','')
+ ISNULL(Name + ', ','')
+ ISNULL(Settlement + ', ','')
+ ISNULL(Cou_Unit + ', ', '')
+ ISNULL(Postcode,'')
--AS ClosestAddress
FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY (Longitude = 12.2132) * (Longitude = 12.2132) + (Latitude - 12.2132) * (Latitude - 12.2132) ASC
IF (RIGHT(@ClosestAddress, 2) = ', ')
RETURN SUBSTRING(@ClosestAddress, 0, LEN(@ClosestAddress))
ELSE
RETURN @ClosestAddress
为什么这应该有效:连接 NULL + ', '
将产生一个空字符串。然后我们检查字符串是否以 ', '
结尾,如果是,我们 return 除了最后两个字符之外的所有内容。
按如下方式连接 ISNULL 表达式中的逗号:
ISNULL(POI + ', ','')
因此您的查询将如下所示:
SET @SQLQuery = 'SELECT TOP 1 REPLACE((ISNULL(POI + '', '','''') + ISNULL(Name + '', '','''')'
+ ' + ISNULL(Settlement + '', '','''') + ISNULL(Cou_Unit + '', '','''') + ISNULL(Postcode,'''')),'', , '', '', '')'
+ ' AS ClosestAddress FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY '
+ ' (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' * (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' + (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') * (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') ASC'
我创建了一个存储过程,其中 returns 一个字符串的串联字段。问题是其中一些字段可能是空字符串,导致字符串很像下面这样:
, Mendip Road, Farnborough, Hampshire, GU14 9LS
甚至
, , Farnborough, Hampshire, GU14 9LS
我真的很想去掉所有前导逗号,但只有在执行查询后我才会知道这一点。有没有一种方法可以执行查询,对逗号进行模式匹配,然后在最终返回修改后的字符串之前将其删除?
查询本身如下:
SET @SQLQuery = 'SELECT TOP 1 REPLACE((ISNULL(POI,'''') + '', '' + ISNULL(Name,'''') + '', '''
+ ' + ISNULL(Settlement,'''') + '', '' + ISNULL(Cou_Unit,'''') + '', '' + ISNULL(Postcode,'''')),'', , '', '', '')'
+ ' AS ClosestAddress FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY '
+ ' (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' * (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' + (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') * (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') ASC'
EXECUTE(@SQLQuery)
您可以执行类似将所有逗号替换为 space 的操作,然后执行 LTRIM 和 RTRIM 并将所有 space 替换为逗号。
Create table Data(name varchar(10),lastname varchar(10));
insert into Data values('','Doe');
insert into Data values('Jane','Doe');
insert into Data values('Jane','');
SELECT Replace(Rtrim(Ltrim(Replace(ISNULL(name,'') +',' + ISNULL(lastname,'') + ',',',',' '))),' ',',')
from Data
我不知道您是否出于其他原因需要动态 SQL,但我认为这样的事情应该可行(没有动态 SQL);如果你真的确定你出于其他原因需要 Dynamic SQL,那么只需将这个想法重构到你的 Dynamic Statement 中:
DECLARE @ClosestAddress VARCHAR(1000)
SELECT TOP 1
@ClosestAddress = ISNULL(POI + ', ','')
+ ISNULL(Name + ', ','')
+ ISNULL(Settlement + ', ','')
+ ISNULL(Cou_Unit + ', ', '')
+ ISNULL(Postcode,'')
--AS ClosestAddress
FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY (Longitude = 12.2132) * (Longitude = 12.2132) + (Latitude - 12.2132) * (Latitude - 12.2132) ASC
IF (RIGHT(@ClosestAddress, 2) = ', ')
RETURN SUBSTRING(@ClosestAddress, 0, LEN(@ClosestAddress))
ELSE
RETURN @ClosestAddress
为什么这应该有效:连接 NULL + ', '
将产生一个空字符串。然后我们检查字符串是否以 ', '
结尾,如果是,我们 return 除了最后两个字符之外的所有内容。
按如下方式连接 ISNULL 表达式中的逗号:
ISNULL(POI + ', ','')
因此您的查询将如下所示:
SET @SQLQuery = 'SELECT TOP 1 REPLACE((ISNULL(POI + '', '','''') + ISNULL(Name + '', '','''')'
+ ' + ISNULL(Settlement + '', '','''') + ISNULL(Cou_Unit + '', '','''') + ISNULL(Postcode,'''')),'', , '', '', '')'
+ ' AS ClosestAddress FROM [UKStreetsAndPlaces].[dbo].[OS_Locator] ORDER BY '
+ ' (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' * (Longitude ' + @LongitudeOperator + ' ' + CAST(ABS(@Longitude) AS VARCHAR(20)) + ')'
+ ' + (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') * (Latitude - ' + CAST(@Latitude AS VARCHAR(20)) + ') ASC'