我正在创建一个存储过程来将数据插入表中。该表有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
我哪里错了?
答案 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
)
顺便说一下,存储过程中的BEGIN
和END
不是必需的。你不需要将那段代码放入一个块中(因为它不是有条件的或循环的)所以我要么将BEGIN
放回到开头,要么将它们全部取出。