为sql server定义每个连接变量

时间:2014-03-06 14:46:29

标签: c# sql sql-server tsql ado.net

如何实现以下

之类的功能
SqlConnection connection = new SqlConnection("CNStr");

SqlCommand Command = connection.CreateCommand();

command.CommandText = "DECLARE @find varchar(30) = 'Test'; ";

command.ExecuteNonQuery();

command.CommandText = "select * from Some_View_Which_Has_Used_That_Variable_In_ItsWhere_Condition"

var result = command.ExecuteNonQuery();

command.Dispose();

connection.Dispose();

我想在每个连接变量中声明一些,然后在视图,函数等各处使用它们。

如何在不使用临时表和contextId的情况下实现此目标?

提前致谢

2 个答案:

答案 0 :(得分:1)

您不能在sql语句中使用DECLARE

它甚至不是Data Manipulation Language statement。它甚至根本不影响你的Some_View_Which_Has_Used_That_Variable_In_ItsWhere_Condition

这就是为什么它对我来说毫无意义。如果您确实要声明@find,可以在视图中写为手册。

并使用using statement处理您的SqlConnectionSqlCommand

例如;

using(SqlConnection con = new SqlConnection(CNStr))
using(SqlCommand command = con.CreateCommand())
{
  //
}

答案 1 :(得分:1)

唯一明显的每个连接对象持续时间超过一个批处理(即您的ExecuteXXX调用)将是临时表:

command.CommandText = "CREATE TABLE #Settings (find varchar(30) not null);
                       INSERT INTO #Settings (find) VALUES ('Test')";
command.ExecuteNonQuery();

command.CommandText = "select * from Some_View where
                         SomeColumn in (select find from #Settings)"
var result = command.ExecuteReader();

所有变量(无论是标量值还是表值)的生命周期都在各自批次的末尾结束。

可以在连接/会话级别设置一些其他内容(例如CONTEXT_INFO),但它们往往具有固定的,有限的数据类型。