是否可以在使用局部变量的 Transact-SQL 查询中使用 SqlParameter?

问题描述

假设我有一个事务 sql 查询,它执行如下操作:

INSERT INTO Table1 -- Table1 has an identity column for the primary key
(
   Table1Value1,Table1Value2
)
VALUES
(
   @Table1Value1,-- sqlParameter
   @Table1Value2 -- sqlParameter
)   
DECLARE @table1ID int = ScopE_IDENTITY();

INSERT INTO Table2 -- Table2 also has and identity column for the PK
(
   Table1ID -- Must have foreign key to Table1 record
   Table2Value1,Table2Value2
)
VALUES
(
    @table1ID,@Table2Value1,-- sqlParameter
    @Table2Value2  -- sqlParameter
)

DECLARE @table2ID int = ScopE_IDENTITY();

INSERT INTO Table3
(
   Table1ID,-- Foreign Key to Table1 record
   Table2ID,-- Foreign Key to Table2 record
   Table3Value1,Table3Value2
)
VALUES
(
   @table1ID,-- Foreign Key to Table1 record
   @table2ID,-- Foreign Key to Table2 record
   @Table3Value1,-- sqlParameter
   @Table3Value2 -- sqlParameter
)

有没有办法让这个工作?您能否转义本地 transact-sql 变量名,以便它们被任何确定参数位置的人忽略?你能告诉 sqlClient 使用 @ 以外的东西来标识参数吗?有没有办法在不使用存储过程或不必运行子查询的情况下完成这项工作?

谢谢。

解决方法

肯定是打错字了。我把它改回来了,现在它可以工作了。这里唯一的教训是不要在 48 小时内工作 40 小时,并且您可以将参数与 transact-sql 局部变量混合使用。 :-)

我不反对删除它。

,

您可以拥有这样的客户端代码(以 C# 为例):

var cmd = new SqlCommand("exec Procedure @Var1,@Var2",connection);
cmd.Parameters.Add("@Var1",SqlDbType.NVarChar,40).Value = var1Value;
cmd.Parameters.Add("@Var2",40).Value = var2Value;  
connection.Open();
cmd.ExecuteNonQuery();

使用包含如下代码的程序:

-- declare an additional variable in the procedure
DECLARE @VAR3 NVarChar(40) = 'test Value';
SELECT @Var1,@Var2,@Var3;

诀窍是如果你想在你的 SQL 代码或过程中声明一个变量只在过程或脚本中使用,不要同时从客户端为它提供参数,因为那会声明同一个变量两次.

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...