这个sql语句出了什么问题?

时间:2012-08-16 14:31:21

标签: sql sql-server stored-procedures

Create Procedure ssp_InsertClientDefaults(
@cid int
)
AS
BEGIN
INSERT INTO ClientTermData
  (ClientID, TermID, NormCount, NormProb, DiscCount, DiscProb, Weight) 
WHERE NOT EXISTS
  (SELECT 
   @cid, GlobalTermData.TermID, GlobalTermData.NormCount, GlobalTermData.NormProb, 
   GlobalTermData.DiscCount, GlobalTermData.DiscProb, GlobalTermData.Weight 
   FROM GlobalTermData, DefaultTerms 
  WHERE DefaultTerms.TermID = GlobalTermData.TermID);
END
GO

我在' Where'中收到错误。我无法弄清楚什么是错的。

4 个答案:

答案 0 :(得分:1)

你可能想要的是:

Create Procedure ssp_InsertClientDefaults
(
        @cid int
    )
AS
        BEGIN
            Insert into ClientTermData(ClientID,TermID,NormCount,NormProb,DiscCount,DiscProb,Weight) 
                Select @cid, GlobalTermData.TermID, GlobalTermData.NormCount, 
                   GlobalTermData.NormProb,GlobalTermData.DiscCount,GlobalTermData.DiscProb,
                    GlobalTermData.Weight 
                from GlobalTermData
                Where not exists( Select 1 
                                  from GlobalTermData INNER JOIN DefaultTerms 
                                  on DefaultTerms.TermID = GlobalTermData.TermID
                                  where DefaultTerms.TermID = GlobalTermData.TermID
                                -- And possibly some other exclusion filter using @cid here
                    );
        END
GO

修改

解释 - 正如其他人所指出的那样,你不能将where子句中的'select'列返回到插入方式。此外,exists函数可以检查几乎任何东西 - 不需要将所有列都放在exists中。最后,更多的是样式问题,但最好是使用where连接条件进行内连接而不是交叉连接。

答案 1 :(得分:0)

我不完全确定,但您是否错过VALUES ('foo','bar')后的INSERT INTO (derp,cookies)部分内容?

答案 2 :(得分:0)

您没有值列表 - 您不能将where子句作为insert语句的值列表。你需要一个select语句。您的查询应该是这样的:


Create Procedure ssp_InsertClientDefaults( 
@cid int 
) 
AS 
BEGIN 
Insert into ClientTermData(ClientID,TermID,NormCount,NormProb,DiscCount,DiscProb,Weight) 
select [something] from [table]
Where not exists( Select @cid,GlobalTermData.TermID,GlobalTermData.NormCount,GlobalTermData.NormProb,GlobalTermData.DiscCount,GlobalTermData.DiscProb,GlobalTermData.Weight from GlobalTermData,DefaultTerms where DefaultTerms.TermID = GlobalTermData.TermID); 

END 
GO 



另外,不要忘记您的选择值列表必须与insert into statement匹配。

答案 3 :(得分:0)

您不能以这种方式使用WHERE子句。检查MSDN的INSERT..INTO sintax

您应该执行以下操作:

INSERT your_table(your_columns)
SELECT your_values
  FROM other_table
 WHERE your_where_conditions