用于从查询中检索数据的插入

时间:2014-01-30 16:57:30

标签: sql-server tsql stored-procedures insert

我正在创建一个存储过程来将数据插入表中。该表有8个字段。其中五个是输入,另外三个需要从依赖于前五个的查询中检索。 在begin语句之前,我想创建一个temp_table(因为它只需要一个查询来获取其余的数据),并且在VALUES中(从#temp_table中选择col1,从#temp_table中选择col2 ......)。 真的需要一些语法和顺序的帮助。

CREATE PROCEDURE dbo.table
     @ value1 int,
     @ value2 int, ...etc
AS 
  SET NOCOUNT ON
  IF object_ID('tempdb..#temp_table') is not null drop table #temp_table
  SELECT some stuff 
  INTO #temp_table 
  FROM some place
  WHERE magical things happen...
BEGIN
   INSERT INTO dbo.table
   ( fields )
   VALUES 
   (
      select colum1 from #temp_table
      etc
   )
END

我哪里错了?

2 个答案:

答案 0 :(得分:2)

您可以执行类似

的操作
INSERT INTO Tab (col1, col2,....., col8)
SELECT @var1, @var2, ...., var5, t2.val1, t2.val2, t2.val3
FROM Tab2 t2
WHERE (/*you can do your filtering here*/)

答案 1 :(得分:0)

您可以在不必使用临时表的情况下执行此操作,可能使用公用表表达式。但是,如果创建临时表更简单,那么一定要这样做。

CREATE TABLE #temp_table
(
    col6 int, -- change data types as appropriate
    col7 int,
    col8 int
    ...
)

INSERT INTO #temp_table
SELECT value6, value7 ... FROM Whatever -- whatever the query is.


INSERT INTO FinalTable
(col1, col2, col3, col4, col5, col6, col7, col8)
SELECT @param1, @param2, @param3, @param4, @param5, col6, col7, col8
FROM   #temp_table

我不确定你想要在BEGIN之前创建临时表是什么意思。你的意思是在存储过程之外,使用临时表作为表值参数,还是只想在存储过程的最开始创建临时表?

ETA:好的,如果您遇到子查询的问题,可能是因为您没有将它们包装在()中。试试这个:

INSERT INTO dbo.table
( fields )
VALUES 
(
  (select top 1 column1 from #temp_table) ,
  (select top 1 column2 from #temp_table)
  -- etc
)

顺便说一下,存储过程中的BEGINEND不是必需的。你不需要将那段代码放入一个块中(因为它不是有条件的或循环的)所以我要么将BEGIN放回到开头,要么将它们全部取出。