我在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。
答案 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
您需要选择要插入新表的所有列,然后运行。
这对我有用。