2014-09-30 37 views
1

简单版本SQL Server:插入各种源

这是什么正确的语法?

INSERT INTO foo(IP, referer) 
VALUES(SELECT bin FROM dbo.bar("foobar"),"www.foobar.com/test/") 

我越来越近“选择”和“)”

加长版语法错误:在现实中我想用一个函数和一个字符串(这是简化的插入,会有几个其他值包括日期时间,整数等与功能结果一起插入)。

我有一个函数,itvfBinaryIPv4,它被设置为将IPs转换为二进制(4)数据类型以便于索引,我将其用作参考:Datatype for storing ip address in SQL Server

所以这就是我要完成的:

INSERT INTO foo (IP, referer) 
VALUES(SELECT bin FROM dbo.itvfBinaryIPv4("192.65.68.201"), "www.foobar.com/test/") 

不过,我得到附近的“选择”和“)”的语法错误。插入函数结果和直接数据的正确语法是什么?

+0

itvfBinaryIPv4是scaller函数还是表值函数? – 2014-09-30 15:09:50

+0

表值函数。就像我说的那样,我从引用的SO文章中运行create语句,并将其自动放置在Table-valued Functions下。 – 2014-09-30 15:14:22

+0

好吧,检查我的答案... – 2014-09-30 15:17:00

回答

1

它应该是这样的 -

INSERT INTO foo (IP, referer) 
    SELECT bin, 'www.foobar.com/test/' 
    FROM dbo.itvfBinaryIPv4('192.65.68.201') 

这里假设dbo.itvfBinaryIPv4("192.65.68.201")是表值函数。

+0

这工作,除了一些小的变化:INSERT INTO foo(referer,IP)SELECT'www.foobar.com/test/',bin FROM dbo.itvfBinaryIPv4('192.65.68.201 “)。 [切换选择器集中的列名称并将双引号更改为函数参数中的单引号] – 2014-09-30 15:18:04

+0

是的,我已更新它。再次检查... :) – 2014-09-30 15:20:10

+0

也想添加如何使用标量值二进制到IP函数进行SELECT:SELECT referer,dbo.fnDisplayIPv4(IP)FROM foobar – 2014-09-30 16:23:41

0

还没有签,但正确的语法是:

INSERT INTO foo (IP, referer) 
SELECT bin, "www.foobar.com/test/" FROM dbo.itvfBinaryIPv4("192.65.68.201") 
1

INSERT命令有两种形式:

(1)要么你有你的所有值,文字或SQL Server变量 - 在这种情况下,您可以使用INSERT .. VALUES()方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) 
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN) 

注意:我会建议总是明确指定要插入数据的列的列表 - 如果突然你的表格有额外的列,或者如果你的表格有IDENTITY或计算出来,你不会有任何令人讨厌的惊喜柱。是的 - 这是一个更多的工作 - 一次 - 但你的INSERT声明尽可能坚实,如果你的表更改,你将不必一直摆弄它。

(2)如果把所有的值作为文本和/或变量,而是要依靠另一个表,多个表或视图,为客户提供价值,那么你可以使用INSERT ... SELECT ...方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN) 
    SELECT 
     SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN 
    FROM 
     dbo.YourProvidingTableOrView 

在这里,你必须定义在SELECT一样多的项目,如您INSERT希望 - 那些可以从表中(S)(或视图(S))栏,或那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。

您可以使用一个或其他 - 但你不能将两者混合 - 你不能使用VALUES(...),然后在值列表的中间SELECT查询 - 挑两个中的一个 - 坚持它。