【发布时间】: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