如何在不向服务器提交SQL语句的情况下获得SqlParameter的字符串表示形式?
本文关键字:SqlParameter 字符串 表示 情况下 服务器 提交 语句 SQL | 更新日期: 2023-09-27 18:08:06
如何将参数化字符串(如"(@param1, @param2, @param3)")转换为正常的SQL语句(例如,如果我要执行查询)?
这将有助于在批处理(很长的)插入查询中直接用它们的值替换一组参数,其中相同的参数名称可以重用。
我知道以下问题,但它们没有提供适当的答案(除了断言是服务器从它单独收到的参数进行转换):
- 如何在。net (VB或c#)中获得参数化查询实际执行的SQL ?
- 获取添加参数后的SQL语句
不确定这是否是您正在寻找的,但是我为SqlCommand
创建了一个名为ToSql()
的扩展方法,该方法声明所有参数,设置文字值,然后使用CommandText生成一个独立的SQL语句。然后,我可以将语句复制并粘贴到SSMS中,并从那里继续调试。
我希望我能和你分享代码,但这是我雇主的财产。此外,它实际上很容易写,而且是一个有趣的练习。我来描述一下它是如何工作的。
例如:var command = new SqlCommand(@"
SELECT *
FROM Table
WHERE
Column1 = @Param1
AND Column2 = @Param2
");
command.Parameters.AddWithValue("@Param1", 555);
command.Parameters.AddWithValue("@Param2", "StackOverflow's cool");
...
现在,在调试时,我简单地为command.ToSQL()
添加一个手表,我得到以下文本:
DECLARE @Param1 INT SET @Param1 = 555
DECLARE @Param2 VARCHAR(MAX) SET @Param2 = 'StackOverflow''s cool'
SELECT *
FROM Table
WHERE
Column1 = @Param1
AND Column2 = @Param2
对于存储过程,结果如下所示:
DECLARE @Param1 INT SET @Param1 = 555
DECLARE @Param2 VARCHAR(MAX) SET @Param2 = 'StackOverflow''s cool'
EXECUTE Some_Stored_Procedure
@Param1 = @Param1
,@Param2 = @Param2
我不建议在生产环境中使用这段代码,它可能对SQL注入攻击不安全,但它是一个非常有用的调试工具!我刚刚为SQLite找到了类似的东西:
SQLiteCommand cmd = new SQLiteCommand("INSERT INTO `" + rolesTable + "`" +
" (Rolename, ApplicationName) " +
" Values($Rolename, $ApplicationName)", conn);
cmd.Parameters.Add("$Rolename", DbType.String, 255).Value = rolename;
cmd.Parameters.Add("$ApplicationName", DbType.String, 255).Value = ApplicationName;