0

我有以下 SQL,

  SELECT TD.MyTempTableID
        ,TD.ID
        ,TD.Name
        ,TD.PhoneNumber
        ,TD.Featured
        ,TD.Price
        ,TD.Available
        ,TD.ModelNumber
        ,TD.Searchable
        ,TD.Brand
        ,TD.Tags
        ,TD.ShortDescriptions
        ,TD.Variations
        ,TD.Promotion
        ,TD.Archive
        ,TD.UPC
        ,TD.Status
FROM    MyTempTable YD
WHERE   TD.Brand = @Brand

现在我需要验证我的 SP 中所有这些行的所有字段。这该怎么做?

4

4 回答 4

2

我会在临时表中添加一列IsValid BIT DEFAULT(1)

接下来,我将运行每列的每个验证例程:

UPDATE MyTempTable
SET IsValid = 0
WHERE IsNumeric(PhoneNumber) = 0
-- don't process rows that have already failed
AND IsValid = 1

对每一列重复上述操作,将 WHERE 子句替换为使该值无效的内容。

完成后,您可以查询WHERE IsValid = 1以获取通过验证的行或未通过WHERE IsValid = 0一项或多项测试的行。

因为当您想要描述失败的原因时,您可以添加另一列ErrorReason VARCHAR(MAX) DEFAULT('')

UPDATE MyTempTable
SET IsValid = 0,
    -- note I'm forcing a line-break here inside the string so each reason is on a new line
    ErrorReason += 'PhoneNumber must be numeric
' 
WHERE IsNumeric(PhoneNumber) = 0

请注意,在这种情况下,我们不包括AND IsValid = 1条件,因为我们想要获得失败的多个原因。如果您只想要失败的第一个原因,请随意添加。

现在,当您完成时,带有的行IsValid = 0也将有一个或多个原因。

于 2013-09-12T01:55:18.893 回答
1
Declare @ID as varchar(500)
Declare @Name as varchar(30)
Declare @MOBILE as varchar(20)
 --AND OTHER vARUIABLE FOR oTHER FIELDS
Declare MY_data CURSOR FOR

 SELECT TD.MyTempTableID
        ,TD.ID
        ,TD.Name
        ,TD.PhoneNumber
        ,TD.Featured
        ,TD.Price
        ,TD.Available
        ,TD.ModelNumber
        ,TD.Searchable
        ,TD.Brand
        ,TD.Tags
        ,TD.ShortDescriptions
        ,TD.Variations
        ,TD.Promotion
        ,TD.Archive
        ,TD.UPC
        ,TD.Status
FROM    MyTempTable YD
WHERE   TD.Brand = @Brand

OPEN MY_data
    FETCH NEXT FROM MY_data INTO @ID, @Name ,@MOBILE -- All other Declared vARIABLE FOR EACH COLUMNS EACH SEPERATE BY ','
        WHILE @@FETCH_STATUS = 0
        BEGIN
 --Here you can validate data for each row since each row value is stored in vaariables above like
if( ! IsNumeric(@Mobile))
Delete From TableName where Id=@Id

        END
    CLOSE MY_data
DEALLOCATE MY_data
于 2013-09-11T12:23:43.820 回答
1

根据您正在执行的验证类型和结果集的预期大小、表上的索引和原始数据集的大小,有几种方法可能有效,最简单的方法是 SELECT * into #tmp From TableName Where。 .. 然后在#tmp 上运行查询以删除不匹配的记录或只选择匹配的记录。没有更多细节,很难给你一个更具体的答案。

忘记这部分。为什么不

DELETE From Table where ISnumeric(PhoneNumber)=0

使用适当的 where 子句...

于 2013-09-11T13:18:14.063 回答
-1

您是否期望在您的 SP 中进行这种类型的验证

创建过程 SP_name

开始

选择 LEN(TD.Name) > 0 时的大小写,然后选择“有效名称”,否则选择“无效”结束,当 isumeric(TD.phonenumber) = 0 时选择大小写,然后选择“有效”,否则“无效”结束,当……来自表的情况

结尾

于 2013-09-14T19:06:44.740 回答