如何验证SP中的记录列表?

时间:2013-09-11 11:49:46

标签: sql sql-server tsql sql-server-2008-r2

我有以下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 个答案:

答案 0 :(得分: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的行也会有一个或多个原因。

答案 1 :(得分: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

答案 2 :(得分:1)

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

忘掉这部分。 为什么不

DELETE From Table where ISnumeric(PhoneNumber)=0

适当的where子句......

答案 3 :(得分:-1)

您是否期望在SP内部进行此类验证

创建proc SP_name

开始

选择 LEN(TD.Name)>的情况0然后“有效名称”否则“无效”结束, 当isnumeric(TD.phonenumber)= 0然后“有效”否则“无效”结束时的情况, 案例...... 从表

相关问题