我理解调试器正在做什么,但我并不真正同意它,因为以下内容肯定会有效:
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
错误信息如下:
Msg 2714,Level 16,State 1,Line 15已经有一个名为的对象 数据库中的'#extract'。
请注意 - 我在整个脚本中声明了我需要的变量,即脚本是存储过程的一部分,变量应该在整个过程中具有范围。
答案 0 :(得分:1)
使用Go
语句,确保当前批量执行的范围
:setvar TotalScope 10
IF OBJECT_ID('tempdb..#extract') IS NOT NULL
DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
//what ever Operation what you want to Perform on `#extract`
GO
// So here `#extract` is not available then You can Create New One Now
select $(TotalScope)
IF OBJECT_ID('tempdb..#extract') IS NOT NULL
DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
// Again Do what ever Operation what you want to Perform on `#extract`
GO
// So here `#extract` is not available then You can Create New One Now
修改强>
您无法在批量执行之间使用此类型的@TotalScope
变量但您需要启用SQL CMD MODE
然后您可以使用我更新以上代码
注意:如建议您使用alroc而不是创建新表一,如果您截断表格会更好
答案 1 :(得分:1)
在查询结束时不会自动删除临时表,只有在删除当前与DB的连接或使用DROP TABLE显式删除它们时才会删除它们#tablename
已编辑:只要您在循环中运行它,这将作为SP运行,这对我有用,试试这个:
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
在它们之间没有'GO',整个事物将被视为一个单独的脚本,所以当CREATE语句尝试创建一个同名的表时,afetr在它之前删除它,它表明它已经存在,因为它是一个单独的脚本,其中同一个表的DROP和CREATE不能齐头并进,因为DROP在执行语句之前没有完全生效,在这种情况下,它是一个大的语句,发生CREATE错误
使用“GO”,它会将脚本的一部分视为“GO”作为一个批处理,并在“GO”之后进入查询之前执行。
所以我再次建议:
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);
GO
IF OBJECT_ID('TEMPDB..#extract') IS NOT NULL DROP TABLE #extract;
CREATE TABLE #extract(
x VARCHAR(100),
NumX_Rank NUMERIC(18,2),
NumG_Rank NUMERIC(18,2)
);