Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 是否可以将变量与“DIALOG”和“CONVERSATION”命令一起使用?_Sql Server_Schema_Database Project - Fatal编程技术网

Sql server 是否可以将变量与“DIALOG”和“CONVERSATION”命令一起使用?

Sql server 是否可以将变量与“DIALOG”和“CONVERSATION”命令一起使用?,sql-server,schema,database-project,Sql Server,Schema,Database Project,我已经能够设置我的VisualStudio2019数据库项目,并对表、存储过程、视图等使用数据库引用。它们似乎都与我导入的模式匹配得很好。然而,当我引用同一数据库的契约、类型、服务等时,我似乎无法避免错误。当我引用目标数据库的服务时,我没有问题,我认为这是因为它接受基本的NVARCHAR字符串而不是强类型模式 我有下面的示例,它只向另一个数据库的服务发送一条消息。我得到错误:SQL71502:过程:[dbo]。[z_Queue\u SendMessage]具有对对象[@VariableName]

我已经能够设置我的VisualStudio2019数据库项目,并对表、存储过程、视图等使用数据库引用。它们似乎都与我导入的模式匹配得很好。然而,当我引用同一数据库的契约、类型、服务等时,我似乎无法避免错误。当我引用目标数据库的服务时,我没有问题,我认为这是因为它接受基本的NVARCHAR字符串而不是强类型模式

我有下面的示例,它只向另一个数据库的服务发送一条消息。我得到错误:SQL71502:过程:[dbo]。[z_Queue\u SendMessage]具有对对象[@VariableName]的未解析引用,其中@VariableName是以下所有项:@RequestMessageType、@BasicContract、@InitiatorService

CREATE PROCEDURE [dbo].[z_Queue_SendMessage]
    @ProcedureName VARCHAR(1000) = 'Procedure', 
    @SubProcedureName VARCHAR(500) = 'SO', 
    @ProcedureType VARCHAR(200) = 'Delete', 
    @Inserted AS XML = NULL, 
    @Deleted AS XML = NULL
AS


DECLARE @InitDlgHandle UNIQUEIDENTIFIER;

DECLARE @RequestMsg NVARCHAR(MAX);
DECLARE @Message XML;

DECLARE @RequestMessageType NVARCHAR(100) = '//$(WebDb)' + N'/Queue/RequestMessage'
DECLARE @InitiatorService NVARCHAR(100) = '//$(WebDb)' + N'/Queue/InitiatorService'
DECLARE @BasicContract NVARCHAR(100) = '//$(WebDb)' + N'/Queue/BasicContract'
DECLARE @TargetService NVARCHAR(100) = '//$(WebDb)' + N'/Queue/TargetService'


BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
        FROM SERVICE [@InitiatorService] --Here
        TO SERVICE @TargetService
        ON CONTRACT [@BasicContract] --Here
        WITH
            ENCRYPTION = OFF;

SET @Message = (SELECT
                ProcedureName    = @ProcedureName,
                SubProcedureName = @SubProcedureName,
                ProcedureType    = @ProcedureType,
                Inserted         = @Inserted,
                Deleted          = @Deleted
            FOR XML PATH('Request'));

SEND ON CONVERSATION @InitDlgHandle
        MESSAGE TYPE [@RequestMessageType] --Here
        (@Message);

SELECT @Message AS SentRequestMsg;

COMMIT TRANSACTION;
是否有任何方法可以格式化此文件,以便在不使用动态SQL的情况下不会收到错误消息?如果我不能通过抑制错误或使用动态SQL来确认它与数据库模式匹配,那么它就无法达到目的

有效


尽量不要同时引用@InitiatorService、@BasicContract和@RequestMessageType-这根本没有意义。

我最终不得不将创建脚本/文件导入到我的Visual Studio数据库项目中,以使这一切正常工作,而不会出现语法错误

我尝试提取DACPAC,但未选中Include应用程序范围的对象,并选中Include扩展属性,但仍然遇到与以前相同的问题

我在我的项目中为消息、服务和合同添加了单独的SQL项。示例:

服务:

CREATE SERVICE [//Web/Queue/InitiatorService]
    ON QUEUE DataQueue;
合同:

CREATE CONTRACT [//Web/Queue/BasicContract]
(
    [//Web/Queue/RequestMessage] SENT BY INITIATOR,
    [//Web/Queue/ReplyMessage] SENT BY TARGET
)
消息类型:

CREATE MESSAGE TYPE [//Web/Queue/ReplyMessage]
       VALIDATION = WELL_FORMED_XML;
CREATE MESSAGE TYPE [//Web/Queue/RequestMessage]
    VALIDATION = WELL_FORMED_XML;
这使我仍然符合数据库模式,并避免将来出现错误。我仍然使用SQLCMD变量引用目标服务,因此除了开发环境和生产环境中的服务外,我可以使用相同的名称。下面是我现在发送消息的存储过程:

CREATE PROCEDURE [dbo].[z_Queue_SendMessage]
    @ProcedureName VARCHAR(1000) = 'Procedure', 
    @SubProcedureName VARCHAR(500) = 'SO', 
    @ProcedureType VARCHAR(200) = 'Delete', 
    @Inserted AS XML = NULL, 
    @Deleted AS XML = NULL
AS


DECLARE @InitDlgHandle UNIQUEIDENTIFIER;

DECLARE @RequestMsg NVARCHAR(MAX);
DECLARE @Message XML;

DECLARE @TargetService NVARCHAR(100) = N'//$(WebDb)/Queue/TargetService'

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
        FROM SERVICE [//Web/Queue/InitiatorService]
        TO SERVICE @TargetService
        ON CONTRACT [//Web/Queue/BasicContract]
        WITH
            ENCRYPTION = OFF;

SET @Message = (SELECT
                ProcedureName    = @ProcedureName,
                SubProcedureName = @SubProcedureName,
                ProcedureType    = @ProcedureType,
                Inserted         = @Inserted,
                Deleted          = @Deleted
            FOR XML PATH('Request'));

SEND ON CONVERSATION @InitDlgHandle
        MESSAGE TYPE [//Web/Queue/RequestMessage]
        (@Message);

SELECT @Message AS SentRequestMsg;

COMMIT TRANSACTION;

[@variable]在该用法中在任何命令中都无效,因为它引用了名为@variable的标识符。[..]构造引用任何内容,例如选择1作为[I am a column,@novariablesher!]与选择1作为列@novariablesher!相同!。它可以很好地创建合同。这样做不会出现错误/警告,并且在部署到数据库时似乎可以正常工作。不过,这是一个脚本,而不是SP.CREATE CONTRACT[@BasicContract][@RequestMessageType]由发起方发送,[@ReplyMessageType]由目标方发送;GOI会检查数据库中的合同名称..合同名称似乎没有问题。有没有可能不是用DACPAC文件提取的?我希望通过这种方式引用它们,而不是将其构建到数据库项目中,但这可能是我唯一的选择,可以在没有警告的情况下编译它,假设它可以工作。@Nathancamp,您确定合同名称与变量名规范的预期一致吗?我希望契约的名称是变量名,而不是变量的值:从sys.service_contracts中选择*FROM name='@BasicContract';谢谢,这确实解决了编译问题,但没有VS的引用警告。我不能引用服务/合同/类型,或者DACPAC根本不包含它。我尝试过使用提取数据库模式的选项,但仍然没有成功地让VS将其视为有效的引用。我想我可能必须在数据库项目本身中部署这些。
CREATE PROCEDURE [dbo].[z_Queue_SendMessage]
    @ProcedureName VARCHAR(1000) = 'Procedure', 
    @SubProcedureName VARCHAR(500) = 'SO', 
    @ProcedureType VARCHAR(200) = 'Delete', 
    @Inserted AS XML = NULL, 
    @Deleted AS XML = NULL
AS


DECLARE @InitDlgHandle UNIQUEIDENTIFIER;

DECLARE @RequestMsg NVARCHAR(MAX);
DECLARE @Message XML;

DECLARE @TargetService NVARCHAR(100) = N'//$(WebDb)/Queue/TargetService'

BEGIN TRANSACTION;

BEGIN DIALOG @InitDlgHandle
        FROM SERVICE [//Web/Queue/InitiatorService]
        TO SERVICE @TargetService
        ON CONTRACT [//Web/Queue/BasicContract]
        WITH
            ENCRYPTION = OFF;

SET @Message = (SELECT
                ProcedureName    = @ProcedureName,
                SubProcedureName = @SubProcedureName,
                ProcedureType    = @ProcedureType,
                Inserted         = @Inserted,
                Deleted          = @Deleted
            FOR XML PATH('Request'));

SEND ON CONVERSATION @InitDlgHandle
        MESSAGE TYPE [//Web/Queue/RequestMessage]
        (@Message);

SELECT @Message AS SentRequestMsg;

COMMIT TRANSACTION;