从表工作SELECT INTO但从视图失败

时间:2016-05-07 16:08:51

标签: sql-server select stored-procedures view

我有一个选择字段到数据表的sproc。 我有一个源表,并创建了一个指向同一源表的视图。当我使用表作为源运行sproc时,所有都按预期工作,但是当我使用视图作为源运行sproc时,没有任何作用。

任何关于我所缺少的内容都会有所帮助 谢谢比尔

SET @SQL = 'SELECT ' + @TheID + ' as cardID 
            INTO ' + @PV_TempPivotItems + ' 
            FROM ' + @FromTab;

EXEC sp_executesql @SQL;

@FromTab是一个表时,它可以正常工作,但当@FromTab被查看时,它会失败。

SET @itemProvision = 'ALTER TABLE ' + @PV_TempPivotItems +

当我尝试更改从源表创建的新表时,它按预期工作但当我尝试使用视图作为源创建时更改新表时,我找不到表。

IF EXISTS(SELECT name
          FROM   sysobjects
          WHERE  name = @PV_TempPivotItems
                 AND xtype = 'U')
  BEGIN
      EXEC('drop table ' + @PV_TempPivotItems)
  END

SET @SQL ='SELECT ' + @TheID + ' as cardID 
           INTO ' + @PV_TempPivotItems + '
           FROM ' + @FromTab;

EXEC sp_executesql @SQL;

SET @itemProvision = 'ALTER TABLE ' + @PV_TempPivotItems + '
        ADD
        CardName varchar(50),
        CardDescription varchar(max),
        CardHref varchar(250),
        CardImage varchar(250),
        CONSTRAINT PK_PV_TempPivotItems PRIMARY KEY(cardID)
        ;'

EXEC sp_executesql @itemProvision; 

2 个答案:

答案 0 :(得分:1)

发现问题 我通过@FromTab参数从源数据动态获取主键,并使用返回的字段来设置@TheID参数,然后在其他查询中使用该参数。 当源是Table时返回主键字段名称,但当源是View时未返回任何内容。不用说,依赖于@TheID参数的后续查询无法执行。

非常感谢 pyNoob 为您提供时间和帮助。

答案 1 :(得分:0)

我测试了以下脚本,每个脚本都按预期工作。脚本A使用物理表作为第一个动态表创建的源。脚本B使用视图作为源表创建。

两者都成功执行并产生相同的输出。请参阅下文。

脚本A |物理表作为来源

GO
--CREATE PHYSICAL TABLE FOR TEST
CREATE TABLE dbo.testdata (COL_A INT NOT NULL)


INSERT INTO testdata
VALUES (1),(2),(3),(4),(5)



--TEST DYNAMIC SQL TABLE CREATION USING PHYSICAL TABLE
GO
DECLARE @PV_TempPivotItems NVARCHAR(50) = 'dbo.newtable'
DECLARE @FromTab NVARCHAR(50) = 'dbo.testdata'
DECLARE @TheID NVARCHAR(50) = 'COL_A'


DECLARE @SQL NVARCHAR(255)
SET @SQL ='SELECT ' + @TheID + ' as cardID 
           INTO ' + @PV_TempPivotItems + '
           FROM ' + @FromTab;

EXEC sp_executesql @SQL;


-- TEST ALTER TABLE WITH PHYSICAL TABLE
GO 
DECLARE @PV_TempPivotItems NVARCHAR(50) = 'dbo.newtable'
DECLARE @itemProvision NVARCHAR(255)
SET @itemProvision = 'ALTER TABLE ' + @PV_TempPivotItems + '
        ADD
        CardName varchar(50),
        CardDescription varchar(max),
        CardHref varchar(250),
        CardImage varchar(250),
        CONSTRAINT PK_PV_TempPivotItems PRIMARY KEY(cardID)
        ;'

EXEC sp_executesql @itemProvision; 

脚本B |查看表创建源

GO
--CREATE PHYSICAL TABLE FOR TEST
CREATE TABLE dbo.testdata (COL_A INT NOT NULL)


INSERT INTO testdata
VALUES (1),(2),(3),(4),(5)


--CREATE VIEW FROM PHYSICAL TABLE
GO
CREATE VIEW card_view
as
SELECT * FROM dbo.testdata


--TEST DYNAMIC SQL TABLE CREATION USING VIEW
GO
DECLARE @PV_TempPivotItems NVARCHAR(50) = 'dbo.newtable'
DECLARE @FromTab NVARCHAR(50) = 'dbo.card_view'
DECLARE @TheID NVARCHAR(50) = 'COL_A'


DECLARE @SQL NVARCHAR(255)
SET @SQL ='SELECT ' + @TheID + ' as cardID 
           INTO ' + @PV_TempPivotItems + '
           FROM ' + @FromTab;

EXEC sp_executesql @SQL;


-- TEST ALTER TABLE WITH PHYSICAL TABLE CREATED FROM VIEW
GO 
DECLARE @PV_TempPivotItems NVARCHAR(50) = 'dbo.newtable'
DECLARE @itemProvision NVARCHAR(255)
SET @itemProvision = 'ALTER TABLE ' + @PV_TempPivotItems + '
        ADD
        CardName varchar(50),
        CardDescription varchar(max),
        CardHref varchar(250),
        CardImage varchar(250),
        CONSTRAINT PK_PV_TempPivotItems PRIMARY KEY(cardID)
        ;'

EXEC sp_executesql @itemProvision; 

<强> RESULT

RESULT