如何选择如何填充sql中的#temptable?

时间:2009-04-22 14:27:00

标签: sql sql-server

好的,我有可能是一个非常简单的问题,你的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中,但我怀疑这是一个更普遍的问题......但如果我错了,请告诉我。

6 个答案:

答案 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 选择 * 从产品.... 结束 其他 ....