【问题标题】:Parsing out address data that may not be in one column解析可能不在一列中的地址数据
【发布时间】:2016-07-26 18:26:37
【问题描述】:

我目前正在处理一个项目,其中客户需要有一个字段,在这种情况下,一个城市状态和 zip 字段在视图中分为 3 个单独的字段。我确实找到了可以很好地做到这一点的代码,但是我遇到的问题是,城市状态和邮政编码数据并不总是在同一列中。有时它在 shp_to_addr_2 列中,有时它在 shp_to_addr_3 列中。

代码最终会引发参数错误,因为它有时会传递给它的 null 值。我尝试使用变量来捕获包含数据的列,但最终还是会出现这个讨厌的错误。这是我设置为存储过程的代码,带有错误消息。我做错了什么?

USE [database]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

CREATE PROCEDURE [dbo].[USER_SP_VI_USER_UPS_TRACK_2]

@address VARCHAR(50) = NULL

AS
SET NOCOUNT ON

BEGIN
  UPDATE VI_USER_UPS_TRACK_2
  SET @address = shp_to_addr_3

  IF @address IS NULL
    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ,
    (LEFT(shp_to_addr_2, CHARINDEX(',', shp_to_addr_2) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_2, 
    CHARINDEX(',', shp_to_addr_2) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_2), CHARINDEX(' ', REVERSE
    (RTRIM(shp_to_addr_2))) - 1) AS Zip
    FROM VI_USER_UPS_TRACK_2

  ELSE IF @address IS NOT NULL

    SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ,
    (LEFT(shp_to_addr_3, CHARINDEX(',', shp_to_addr_3) - 1)) AS City, LEFT(LTRIM(SUBSTRING(shp_to_addr_3, 
    CHARINDEX(',', shp_to_addr_3) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_3), CHARINDEX(' ', REVERSE
    (RTRIM(shp_to_addr_3))) - 1) AS Zip
    FROM VI_USER_UPS_TRACK_2
END

程序编译,但执行时我得到这个:

消息 537,级别 16,状态 2,过程 USER_SP_VI_USER_UPS_TRACK_2,第 13 行 传递给 LEFT 或 SUBSTRING 函数的长度参数无效。

【问题讨论】:

  • 您将需要调试您的代码。首先尝试了解剩下的参数 /Right ,子字符串需要什么。然后检查您的代码以查看您是否传递了任何无效参数,这也很难为我们调试,因为没有实际数据可以测试
  • 我建议在将数据放入变量时使用select 而不是update。使用 update 会使事情变得更加混乱,因为您实际上并没有更新表格。
  • 此视图代码在 shp_to_addr_3 中的数据时有效,但在其他列 shp_to_addr_2 中时,它会出错。 SELECT ord_no, cust_no, ord_dat, shp_to_nam, shp_to_addr_1, shp_to_addr_2, shp_to_addr_3, ord_typ, (LEFT(shp_to_addr_3, CHARINDEX(',', shp_to_addr_3) - 1)) AS 城市, LEFT(LTRIM(SUBSTRING(shp_to_addr) , shp_to_addr_3) + 1, 4)), 2) AS ST, RIGHT(RTRIM(shp_to_addr_3), CHARINDEX(' ', REVERSE (RTRIM(shp_to_addr_3))) - 1) AS Zip FROM VI_USER_UPS_TRACK_2

标签: sql sql-server stored-procedures sql-server-2012


【解决方案1】:

您只是将恰好来自表VI_USER_UPS_TRACK_2 的最后一行提取到变量@address 中,并基于此您转到不同的路径。我会假设你的表中有更多的行,所以你的逻辑根本不起作用。

您需要编写一个 case 语句来检查您正在处理的各个行并据此获取数据。

另外,@address 是过程的输入参数,但是您覆盖了过程开头的值。

【讨论】:

  • 我尝试在原始视图代码中执行此操作,但收到相同的错误消息。此处示例:
  • 示例在哪里?您在问题中在 cmets 中发布的代码是完全错误的。您需要一个案例语句来决定从哪个地址字段获取数据。
  • 感谢您的意见。我仍在学习 T-SQL 的高级方面,比我更有经验的同事获得了使用 Case Select 的观点。我不知道为什么我粘贴的示例没有显示出来。我将在 Answers 选项中发布工作代码,以防其他人需要处理类似的项目。
猜你喜欢
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-02
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多