临时表中的Identity_insert

时间:2012-07-28 00:49:30

标签: sql sql-server

我在SQL Server 2012和2008 R2中运行存储过程时遇到问题,而它在SQL Server 2000和2005中运行良好。

请参阅以下代码:

SELECT * INTO #TB_Table_1
FROM (SELECT TOP 1 * FROM TB_Table_2) A

TRUNCATE TABLE #TB_Table_1

我现有的sp有这段代码。目的只是复制TB_Table_2的结构。

注意:TB_Table_2有一个标识列Master_ID

接下来,我将尝试使用以下代码插入数据。这就是我遇到麻烦的地方。

INSERT INTO #TB_Table_1
SELECT * FROM TB_Table_2
WHERE ISNULL(Date,'') = ''
AND ISNULL(ID,'') = ''

我是否需要在SQL Server中设置一些功能才能使其正常工作?

编辑:

我得到的错误是

  

表中标识列的显式值   '#TB_Table_1'只能在列列表中指定   used和IDENTITY_INSERT为ON。

4 个答案:

答案 0 :(得分:2)

如果您的临时表具有标识,要进行此插入,您需要先:

SET IDENTITY_INSERT #TB_Master_Organization ON
插入语句之前的

您需要指定要插入的列:

INSERT INTO #TB_Master_Organization (col1, col2, col3..)
SELECT * FROM TB_Master_Organization
WHERE ISNULL(DeactivatedDate,'') = ''
AND ISNULL(DeactivatedByID,'') = ''

然后,设置identity_Insert。

所以,你得到了:

SET IDENTITY_INSERT #TB_Master_Organization ON
INSERT INTO #TB_Master_Organization (col1, col2, col3..)
    SELECT * FROM TB_Master_Organization
    WHERE ISNULL(DeactivatedDate,'') = ''
    AND ISNULL(DeactivatedByID,'') = ''
SET IDENTITY_INSERT #TB_Master_Organization OFF

此外,如果这不起作用,take a look at this, maybe can help you

答案 1 :(得分:1)

这里首先用于复制表结构的代码不正确。因为它还将前1行复制到新的临时表中。

要复制表格结构,您可以使用以下代码:

select * INTO #TB_Master_Organization FROM TB_Master_Organization where 1=2

然后,您可以通过在此临时表上设置IDENTITY INSERT ON来显式插入数据。

但是你可以通过写下面的查询来轻松实现这个目标:

select * INTO #TB_Master_Organization FROM TB_Master_Organization where WHERE ISNULL(DeactivatedDate,'') = ''
AND ISNULL(DeactivatedByID,'') = ''

在一个查询中,您将获得临时表中的最终数据。

答案 2 :(得分:0)

我遇到了同样的问题,并且在表的标识列中进行了isnull转换,问题已解决ISNULL(P.PersonId,0)

答案 3 :(得分:-1)

SET IDENTITY_INSERT #TB_Master_Organization ON

SELECT COL1,COL2 INTO #TB_Table_1 FROM TB_Table_2

您需要选择要插入新表的所有列,然后运行。

这对我有用。