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

类似于:http://sqlfiddle.com/#!3/6a6c6/1

我不知道您是否出于其他原因需要动态 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'