到目前为止,我已经查找了有关sql中模式匹配的所有相关信息,但没有任何帮助,我收到短信代码,如" yyyy / mm-digit" (每个消息的数字递增)。所以我想确保用户发送的代码完全采用该格式,否则为另一个动作。怎么样?
这是我的旧代码,只检查数字代码,但它需要它,例如" 2014/08位"有点模式,怎么样? (它随年月而变化)
ALTER TRIGGER [dbo].[T_InsertAfterRcvdMessage]
ON
[dbo].[ReceivedMessages]
AFTER INSERT
AS
Declare @msg as varchar(20)
Declare @inmbl as varchar(20)
Declare @cid as int
Declare @ComplainantId as int
BEGIN TRY
SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted
Set @cid = ISNUMERIC(@msg)
if (@cid = 1) -- it means @msg is numeric value
BEGIN
Declare @sts as varchar(50)
Declare @mbl as varchar(20)
(SELECT @sts = Status, @mbl = ContactNo, @ComplainantId = ComplainantID FROM CPOCMS.dbo.View_ComplaintStatusInfo WHERE ComplaintID = @msg)
Exec CmsSMSDb.dbo.ADD_SMS_InQueue @mbl,@sts,0,0,2,1,0,null,@ComplainantId
END
--else
-- BEGIN
-- Exec CmsSMSDb.dbo.ADD_SMS_InQueue @inmbl,'Please Provide Valid Complaint No'
-- END
END TRY
BEGIN CATCH
END CATCH
答案 0 :(得分:3)
如果您尝试匹配“2014 / 08-”,则可以使用正则表达式或SQL Server内置模式。使用内置模式,您可以查找:
where code like '2014/08-[0-9]%' and
code not like '2014/08-%[^0-9]%'
也就是说,代码以2014/08-
和至少一个数字开头。并且,连字符后没有非数字。
编辑:
在代码的上下文中:
SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted;
IF (@msg like '2014/08-[0-9]%' and
@msg not like '2014/08-%[^0-9]%'
) BEGIN
. . .
END;
编辑II:
您没有提到2014/08
更改,但这很容易处理,排序(SQL Server可能有更简单的字符串和日期函数)。试试这个:
SELECT @msg = [Message], @inmbl = FromMobileNo FROM inserted;
DECLARE @yyyymm varchar(255) = (cast(year(getdate()) as varchar(255)) + '/' +
right('00' + cast(month(getdate()) as varchar(255)), 2)
);
IF (@msg like @yyyymm + '-[0-9]%' and
@msg not like @yyyymm + '-%[^0-9]%'
) BEGIN
. . .
END;
这使用当前日期进行比较。您可能还有其他日期要使用。