SQL Server:从各种来源插入

时间:2014-09-30 15:06:46

标签: sql sql-server

简单版

这是什么语法?

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

我在'SELECT'和')'

附近遇到语法错误

长版本:我想使用函数和字符串插入(这是简化的,实际上会有一些其他值,包括datetime,int等,以及函数结果一起插入)。

我有一个函数itvfBinaryIPv4,它被设置为将IP转换为二进制(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/")

但是,我在'SELECT'和')'附近遇到语法错误。插入函数结果和直接数据的正确语法是什么?

3 个答案:

答案 0 :(得分: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")是表值函数。

答案 1 :(得分: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所期望的完全相同的项目 - 这些项目可以是表格(或视图)中的列,或者那些可以是文字或变量。再次:明确提供要插入的列的列表 - 参见上文。

您可以使用其中一个 - 但无法混合两者 - 您无法使用VALUES(...)然后进行SELECT查询在你的价值列表中间 - 选择其中一个 - 坚持下去。

答案 2 :(得分:0)

没有检查过,但正确的语法是:

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