随便新建一个数据库,执行以下脚本,service borker都能正常运行。
但如果附加的数据库或者是还原的数据库,执行以下脚本,连队列消息都发送不了。会是什么原因?
------------------------------
CREATE TABLE CLICKLOG
(
id INT IDENTITY(1,1),
departure char(3),
destination char(3),
LeaveDate datetime,
returndate datetime,
flightid int,
clickdate datetime,
ipaddress varchar(50)
);
go
CREATE MESSAGE TYPE [RecordClick] VALIDATION = NONE;CREATE CONTRACT [ClickContract] ([RecordClick] SENT BY INITIATOR); CREATE QUEUE [ClickQueue];CREATE SERVICE [ClickService] ON QUEUE [ClickQueue]([ClickContract]);GO
CREATE QUEUE [RecordClickQueue];CREATE SERVICE [RecordClickService] ON QUEUE [RecordClickQueue];
go---------------------
----------------------
CREATE PROCEDURE clicklogadditem
AS BEGIN
  DECLARE @Handle UNIQUEIDENTIFIER;  
        DECLARE @MessageType SYSNAME;   
        DECLARE @Message XML ;       
DECLARE @Departure char(3);
DECLARE @Destination char(3);
DECLARE @LeaveDate datetime;
DECLARE @ReturnDate datetime;
DECLARE @Flightid int;
DECLARE @clickDate datetime ;
DECLARE @IpAddress varchar(50);
        RECEIVE TOP (1)    
        @Handle = conversation_handle,    
        @MessageType = message_type_name, 
        @Message = message_body    
        FROM [ClickQueue];                   
         IF(@Handle IS NOT NULL AND @Message IS NOT NULL)
BEGIN         
      SELECT @Departure = CAST(CAST(@Message.query('/Params/Departure/text()') AS NVARCHAR(MAX)) AS char(3))          
      SELECT @Destination = CAST(CAST(@Message.query('/Params/Destination/text()') AS NVARCHAR(MAX)) AS char(3))             
      SELECT @LeaveDate = CAST(CAST(@Message.query('/Params/LeaveDate/text()') AS NVARCHAR(MAX)) AS Datetime)
      SELECT @ReturnDate = CAST(CAST(@Message.query('/Params/ReturnDate/text()') AS NVARCHAR(MAX)) AS Datetime)
      SELECT @Flightid = CAST(CAST(@Message.query('/Params/Flightid/text()') AS NVARCHAR(MAX)) AS int)
      SELECT @clickDate = CAST(CAST(@Message.query('/Params/clickDate/text()') AS NVARCHAR(MAX)) AS Datetime)
      SELECT @IpAddress = CAST(CAST(@Message.query('/Params/IpAddress/text()') AS NVARCHAR(MAX)) AS varchar(50))
INSERT INTO Clicklog(Departure ,Destination ,LeaveDate ,ReturnDate,Flightid ,clickDate ,IpAddress) 
 values(@Departure ,@Destination ,@LeaveDate ,@ReturnDate,@Flightid ,@clickDate,@IpAddress);  
END
--select * from clicklog
ENDGO
------------
-------------
CREATE PROCEDURE sendclicklog(
 @Departure char(3),
@Destination char(3),
@LeaveDate datetime,
@ReturnDate datetime,
@Flightid int,
@clickDate datetime ,
@IpAddress varchar(50)
)ASBEGIN
  DECLARE @MessageBody XML    
CREATE TABLE #ProcParams  (  
Departure char(3),
Destination char(3),
LeaveDate datetime,
ReturnDate datetime,
Flightid int,
clickDate datetime ,
IpAddress varchar(50)
    )   
INSERT INTO #ProcParams(Departure ,Destination ,LeaveDate ,ReturnDate,Flightid ,clickDate ,IpAddress)  
VALUES(@Departure ,@Destination ,@LeaveDate ,@ReturnDate,@Flightid ,@clickDate,@IpAddress)  
      SELECT @MessageBody = (SELECT * FROM #ProcParams FOR XML PATH ('Params'), TYPE);      DECLARE @Handle UNIQUEIDENTIFIER;
      BEGIN DIALOG CONVERSATION @Handle  
   FROM SERVICE [RecordClickService]    
  TO SERVICE 'ClickService'     
 ON CONTRACT [ClickContract]     
 WITH ENCRYPTION = OFF, LIFETIME = 600;
      SEND ON CONVERSATION @Handle  MESSAGE TYPE [RecordClick](@MessageBody);
END
GO
ALTER QUEUE [ClickQueue] WITH ACTIVATION (STATUS = ON,MAX_QUEUE_READERS = 1,PROCEDURE_NAME = clicklogadditem,EXECUTE AS OWNER);GO
------------------------------------
EXECUTE sendclicklog 'd','g','1/9/2005','1/9/2005',30,'1/9/2005','1110'select * from clicklog
select * from clickqueue

解决方案 »

  1.   

    明天去公司试试,自己电脑还没装sql2005
      

  2.   

    有可能是数据库的 Service Broker 功能禁用了, 楼主试试执行下面的语句把选项开启ALTER DATABASE 库名
    SET ENABLE_BROKER
      

  3.   

    如果启用时遇到这样的问题:
    无法启用数据库 "xxx" 中的 Service Broker,因为数据库(C5025E10-12CB-4BA2-9823-277ED551DD7A)中的 Service Broker GUID 与 sys.databases (ACEFA90E-09E6-4BB1-9A3F-514F5AFF8093)中的不匹配。则可用下面的语句, 指定数据库应接收新的 Broker 标识符
    ALTER DATABASE tempdb
    SET NEW_BROKER
      

  4.   

    ALTER DATABASE 库名
    SET ENABLE_BROKER这句我好像试过,不行。我新建了一个数据库,再把数据导过去,就可以了...