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 重写为:
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)
如果需要帐户密钥的默认值,则很容易合并结果