好的,我有可能是一个非常简单的问题,你的Sql大师......
给定一种类型的布尔值,T,我想用数据集A填充临时表,如果T为真,或者如果T为假则填充数据集B.我认为这将是如何做到的:
DECLARE @foo INT
SET @foo = null
IF (@foo is null)
BEGIN
SELECT 'foo was null' INTO #TempTable
END
ELSE
BEGIN
SELECT 'foo not null' INTO #TempTable
END
但这不起作用。我收到一条错误,上面写着“数据库中已经存在一个名为'#TempTable'的对象。”
显然,在评估条件之前,Sql正试图在每种情况下创建表...?这对我来说似乎很奇怪,但没关系......但是做这样的事情的正确方法是什么?
编辑:我在Sql Server中,但我怀疑这是一个更普遍的问题......但如果我错了,请告诉我。
答案 0 :(得分:5)
为什么不使用基于集合的解决方案而不是程序解决方案:
SELECT CASE WHEN @foo is null
THEN 'foo was null'
ELSE 'foo not null'
END AS result
INTO #TempTable
答案 1 :(得分:4)
您需要先创建临时表(应该执行一次):
CREATE TABLE #TempTable TABLE (
message VARCHAR(50)
)
,然后发出:
DECLARE @foo INT
SET @foo = null
IF (@foo is null)
BEGIN
INSERT
INTO #TempTable
SELECT 'foo was null'
END
ELSE
BEGIN
INSERT
INTO #TempTable
SELECT 'foo not null'
END
您可能不希望TEMPORARY TABLE
,而是TABLE VARIABLE
(仅在会话期间存在且不会在数据库架构中保留):
DECLARE @foo INT
DECLARE @TempTable TABLE (
message VARCHAR(50)
)
SET @foo = null
IF (@foo is null)
BEGIN
INSERT
INTO @TempTable
SELECT 'foo was null'
END
ELSE
BEGIN
INSERT
INTO @TempTable
SELECT 'foo not null'
END
答案 2 :(得分:4)
SQL遇到了这个问题,因为解析步骤注意到有两个SELECT INTO
语句。即使你的逻辑要求临时表只创建一次,解析器仍会抱怨它。
解决此问题的一种方法是在GO
之后使用SELECT INTO
语句,但这不适用于条件逻辑。
否则,只需单独创建表并插入其中,如下所示:
CREATE TABLE #TempTable (result varchar(50))
IF @foo is null
BEGIN
insert into #TempTable values ('foo was null')
END
ELSE
BEGIN
insert into #TempTable values('foo was not null')
END
答案 3 :(得分:2)
该表已经创建,您必须先将其删除然后重新插入。
编辑:正如你所说,它不是数据库中已存在的表的问题,你可以尝试这样做 -IF EXISTS (SELECT * FROM sysobjects WHERE object_id = OBJECT_ID(N'#TempTable')
DROP TABLE #TempTable
CREATE TABLE #TempTable (Col1 INT, ...)
IF TRUE
BEGIN
INSERT INTO #TempTable
SELECT VAL1
END
ELSE
BEGIN
INSERT INTO #TempTable
SELECT VAL2
END
答案 4 :(得分:2)
答案 5 :(得分:1)
看看这是否有帮助...... link
您必须在select语句之外创建临时表 然后插入其中。例如,
CREATE TABLE #tmp_table AS SELECT * 来自产品 在哪里1 = 2
IF @condition = 0 开始 INSERT #tmp_table 选择 * 从产品.... 结束 其他 ....