SQLServerifelse语句是怎么进行控制的

老师我研究了这个问题很长时间,最后发现你上面的描述有错误,错误的原因是因为实现机制。
sql的第一个这个脚本sql会自动检查语法问题,第一次检查就没有问题。
如果满足条件,如果此时if语句已经创建了临时表#tmpa,那么最后一部分就是关键。
虽然判断的状态肯定不能令人满意,这次检查语法,因为它已经在上面创建了。
如果此时检查这个临时表的语法;请注意,如果不检查此处的语法并执行它,您肯定会收到错误。
改变IF(1=1)会有所帮助。
BEGINselecttop1nameinto#tmpafromusersENDELSEBEGINexecute('selecttop1idinto#tmpafromusers')endgoselect*from#tmpadroptable#tmpa我希望如果我能解决原始海报的问题,这将被采用。

SELECTINTO语句可以创建本地或全局临时表吗?

能。
SQLServer临时表有两种类型:本地临时表和全局临时表。
它们在可见名称和排列上有所不同。
本地临时表名称以单个数字符号(#)开头;它们仅对当前用户的连接出现;当用户与实例断开连接时,它们将被删除。
全局临时表的名称以两个数字符号(##)开头。
如果数据库会话创建#temptable本地临时表,则该表仅可供该会话使用,并在会话断开连接时被删除。
如果创建了临时全局表##,它将可供数据库中的任何用户使用。
如果创建后该表未被其他用户使用,则断开连接时该表将被删除。
如果您创建一个表并且另一个用户正在使用它,则SQLServer将在您断开连接时将其删除,并且所有其他会话将不再使用该表。
如果本地临时表是由多个用户同时执行的存储过程或应用程序创建的,SQLServer将能够区分不同用户创建的表。
为此,SQLServer在内部向每个临时位置的表名添加一个数字后缀。
tempdb数据库的sysobject表中存储的临时表的全名由createable语句中指定的表名和生成的后缀指定的数制组成。
与后缀一样,为本地临时表指定的表名table_name不能超过116个字符。
当存储的活动完成时,存储过程中创建的临时本地文件将自动删除。
该表可以被创建该表的存储过程所执行的所有存储过程引用。
但是该表不能被调用创建该表的存储过程的进程引用。
临时表位于tempdb数据库系统中。
相反,您可以使用SELECT将查询的任何输出放入新表中,还可以使用SELECT语句解决复杂的问题。
例如,如果您需要从不同的数据源获取数据,如果您最初创建一个临时表,那么对该表执行查询会比对多个表或多个数据库执行查询更容易。
使用SELECT语句时,必须遵守以下规则和原则:使用SELECT语句可以一次性创建表并向表中插入行。
确保SELECTINT中指定的表名是唯一的。
如果存在重复的表名,SELECT将失败。
可以创建本地或全局临时表。
创建本地临时表需要在表名前添加符号;创建全局临时表需要在表名前添加两个符号。
本地临时文件只出现在当前会话中,全局临时文件出现在所有会话中。
当用户的会话终止时,本地临时表中的空间将被回收。
当执行创建表的会话以及引用最新表的表的最后一个Transact-SQL语句时,将恢复全局临时表中的空间。
使用SELECTINT语句的基本语法如下:SELECT<select_list>INTNew_tableFROM{}[,...n]WHERE例如:select*in#newTablefromnewswheres_date>'2010-3-1'使用SQLServer全局临时表防止用户重复登录我们在开发业务软件时,经常会遇到这样的问题:如何防止用户重复登录我们的系统!特别是对于银行或金融部门,应限制用户多次与其员工ID关联。
有人说在用户信息表中添加一个字段来判断用户ID的登录状态。
绑定后写1,绑定时写0,绑定时判断标志位是否为1。
,该用户ID不允许进入。
不管这个它必然会带来新的问题:如果出现不可预知的现象,比如电源事件,系统异常退出,标准位置为0。
然后你用工作用户ID再次打开,就不行了。
你可以登录这个应该怎么办呢?或许我们可以换个思路:是不是有什么东西通过拉连接就与系统本身断开了?对了,SQLServer临时表有这个功能!但这种情况下我们不能使用本地临时表,因为本地临时表对于每个连接来说都是一个独立的对象,所以只能使用全局临时表。
我们就达到了我们目标的形式。
好了,现在为了把事情说清楚,我们可以编写一个简单的存储过程,如下所示:createproceduregp_findtemptable--2001/10/2621:36zhuzhichaoinnanjing/*查找以操作符编号operator命名的全局临时表*如果没有,则设置hand参数设置为0并创建表,因为在某些情况下将额外的参数设置为1。
连接关闭后,全局临时表将由SQLServer本身创建回收后将失去活性。
对象会认为该函数不在判断中。
*/@v_useridvarchar(6),--操作员工号@i_outintout-输出参数0:未启动1:已启动asdeclare@v_sqlvarchar(100)ifobject_id('tempdb.dbo.##'+@v_userid)isnullbeginset@v_sql='可创建##'+@v_userid+'(useridvarchar(6))'exec(@v_sql)set@i_out=0endelseseset@i_out=1在这个过程中我们看到,如果以用户号命名的全局临时文件不存在,进程就会创建它。
一张并设置参数为0,如果已经存在则设置参数为1这样,当我们在应用程序中调用这个过程时,如果参数的结果是1,我们就可以毫不客气地报告消息“对不起,该工号已被使用!”@sTmpWareA="tempdb..[##MARWareA"+@ComputerName+"]"ifexists(select*fromtempdb..sysobjectswhereid=object_id(@sTmpWareA)andtype="U")beginset@sTmpWareA="[##MARWareA"+@计算机名+"]"exec("droptable")endelseset@sTmpWareA="[##MARWareA"+@计算机名+"]"@sTmpWareA是临时表的名称,在exec操作中使用。