T-SQL 参数化查询,其中包含声明的变量

本文关键字:包含 声明 变量 参数 查询 T-SQL | 更新日期: 2023-09-27 18:36:11

这是我尝试执行的代码:

const string Script = @"
DECLARE @AccountKey Int
SELECT @AccountKey = AccountKey FROM dbo.CREAccount WHERE AccountId = @AccountId 
INSERT dbo.CREException (CreatedOn, Message, Source, StackTrace, AccountKey, Category, Priority)
VALUES(GETUTCDATE(), @Message, @Source, @StackTrace, @AccountKey, @Category, @Priority)";
using (var command = new SqlCommand(Script, connection))
{
    var message = ex.Message;
    if (message.Length > 250) message = message.Substring(0, 250);
    command.Parameters.Add(new SqlParameter("@Message", message));
    command.Parameters.Add(new SqlParameter("@Source", ex.Source ?? string.Empty));
    command.Parameters.Add(new SqlParameter("@StackTrace", ex.StackTrace ?? string.Empty));
    command.Parameters.Add(new SqlParameter("@AccountId", accountId));
    command.Parameters.Add(new SqlParameter("@Category", category));
    command.Parameters.Add(new SqlParameter("@Priority", priority));
    command.ExecuteNonQuery();
}

正如预期的那样 - 它失败是因为代码中未指定@AccountKey - 它是T_SQL本身的一个参数。如何在使用参数时实现我想要的东西? accountId参数可以null - 这就是为什么我分解查找并插入到 2 个查询中的原因

T-SQL 参数化查询,其中包含声明的变量

您不能将 T-SQL 重写为:

INSERT INTO 
   dbo.CREException(CreatedOn, Message, Source, StackTrace, AccountKey, Category, Priority)
   SELECT       
      GETUTCDATE(), @Message, @Source, @StackTrace, 
      AccountKey, @Category, @Priority
   FROM 
      dbo.CREAccount 
   WHERE 
      AccountId = @AccountId 

您仍然拥有所有参数,并且您正在从dbo.CREAccount表中确定AccountKey的值,如示例中所示。

也许您需要考虑为AccountKey提供一个"默认"值,以防在表中找不到任何值......

或者,如果由于某种原因这不起作用,那么我可能只是将这两个或三个 T-SQL 语句包装到一个存储过程中,您可以使用参数调用该过程,并让该过程处理您可能需要的所有额外步骤。

您是否尝试将@AccountKey作为sqlparmaeter包含在内,但将其方向更改为输出? 这样,您仍然应该能够在其中选择一个值

根据对marc_s答案的反馈,你总是可以让你的sql看起来像这样。

INSERT dbo.CREException (CreatedOn, Message, Source, StackTrace, AccountKey, Category, Priority)
VALUES(GETUTCDATE(), @Message, @Source, @StackTrace
,(SELECT AccountKey FROM dbo.CREAccount WHERE AccountId = @AccountId)
, @Category, @Priority)

如果需要帐户密钥的默认值,则很容易合并结果