我想选择一个虚拟列Col1
,并希望根据@no_of_col
变量的值相应地创建临时表。
以下查询给出了错误 - There is already an object named '#t' in the database.
你能否告诉我为什么会这样,因为一次只会执行一个条件。
declare @no_of_col int
set @no_of_col = 4
if (@no_of_col = 4)
BEGIN
SELECT procure1 ,procure2
INTO #t
FROM procurement
WHERE region = 'APAC'
END
ELSE IF(@no_of_col = 5)
BEGIN
SELECT procure1,procure2, 'TestCol1' as 'Col1'
INTO #t
FROM procurement
WHERE region = 'EUR'
END
答案 0 :(得分:2)
代码在编译时失败。编译器看到某段代码生成了一个#t
表,因此它获得了该表模式的知识,以便理解代码的其余部分。
然后它看到另一段代码也试图创建一个#t
表,但它已经知道一个,因此发出错误消息。
请注意,此时执行任何代码都不是,因此任何运行时控制流都与此无关。
您可以尝试使用一些丑陋的动态SQL,但我建议改为创建一个包含它可能需要的所有可能列的临时表,然后使用{{1} 填充该表}语句而不是INSERT ... SELECT
然后,如果你必须,只是在最后有一些技巧逻辑,当你返回一个结果集,运行不同查询返回4或5列。
一般情况下,SQL查询生成的结果集具有固定的形状 - 列的数量,名称和类型 - 存储过程和其他包含的逻辑在继续使用时也更容易使用这种传统并不试图改变它们产生的结果集的形状。
答案 1 :(得分:0)
您可能两次运行INTO命令,因此已存在#t表。
INTO就是这样 - 它只运行一次,并在那个机会创建一个表。
你想要的可能就是:
INSERT INTO #t (procure1, procure2)
SELECT procure1 ,procure2
FROM procurement
WHERE region = 'APAC'
或其他任何版本。执行此操作时,请确保已准备好#t表。即CREATE TABLE #t ....
答案 2 :(得分:0)
当数据库引擎编译代码时,SQL编译器会生成错误,它会为同一个表找到2个定义,因此会失败,相反,您可以尝试下面的任何一个
创建表格并稍后插入
const dataKey_1 = "dataKey_1";
const initialQuery = ref_serial_setting;
const filteredQuery = initialQuery.where('data_name', '==', dataKey_1);
filteredQuery.get()
.then(querySnapshot => {
// If your data is unique in that document collection, you should
// get a query snapshot containing only 1 document snapshot here
})
.catch(error => {
// Catch errors
});
或者使用单个插入
declare @no_of_col int
set @no_of_col = 4
IF OBJECT_ID('TempDb..#T') IS NOT NULL
DROP TABLE #T
CREATE TABLE #T
(
procure1 NVARCHAR(255),
procure2 NVARCHAR(255),
Col1 NVARCHAR(50)
)
IF (@no_of_col = 4)
BEGIN
INSERT INTO #T
(
procure1,
procure2
)
SELECT
procure1 ,
procure2
FROM procurement
WHERE region = 'APAC'
END
ELSE IF(@no_of_col = 5)
BEGIN
INSERT INTO #T
(
procure1,
procure2,
Col1
)
SELECT
procure1,
procure2,
'TestCol1' as 'Col1'
FROM procurement
WHERE region = 'EUR'
END