SQL Server:从各种源插入

SQL Server:从各种源插入,sql,sql-server,Sql,Sql Server,简单版 这个的正确语法是什么 INSERT INTO foo(IP, referer) VALUES(SELECT bin FROM dbo.bar("foobar"),"www.foobar.com/test/") “SELECT”和“')附近出现语法错误 长版本:我想使用一个函数和一个字符串插入(这是简化的,实际上会有一些其他值,包括datetime、ints等,与函数结果一起插入) 我有一个函数itvfBinaryIPv4,它被设置为将IP转换为二进制(4)数据类型以便于索引,我使用它作

简单版

这个的正确语法是什么

INSERT INTO foo(IP, referer)
VALUES(SELECT bin FROM dbo.bar("foobar"),"www.foobar.com/test/")
“SELECT”和“')附近出现语法错误

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

我有一个函数itvfBinaryIPv4,它被设置为将IP转换为二进制(4)数据类型以便于索引,我使用它作为参考:

这就是我想要实现的目标:

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

但是,在“SELECT”和“')附近出现语法错误。插入函数结果和直接数据的正确语法是什么-

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

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

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

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

INSERT
命令有两种风格:

(1)或者您有所有可用的值,作为文本或SQL Server变量-在这种情况下,您可以使用
插入。。VALUES()
方法:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView
注意:我建议始终明确指定要插入数据的列的列表-这样,如果突然您的表有一个额外的列,或者如果您的表有一个
标识
或计算列,您将不会有任何令人不快的意外。是的-这是一个稍微多一点的工作-一次-但是你有了你的
INSERT
语句,它尽可能的坚固,如果你的表改变了,你就不必一直摆弄它了

(2)如果没有将所有值作为文本和/或变量,而是希望依赖另一个表、多个表或视图来提供值,则可以使用
插入。。。选择…
进近:

INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
VALUES(Value1, Value2, @Variable3, @Variable4, ...., ValueN)
INSERT INTO dbo.YourTable(Col1, Col2, ...., ColN)
   SELECT
       SourceColumn1, SourceColumn2, @Variable3, @Variable4, ...., SourceColumnN
   FROM
       dbo.YourProvidingTableOrView
在这里,您必须在
SELECT
中定义与
INSERT
所需数量相同的项目,这些项目可以是表(或视图)中的列,也可以是文字或变量。再次:明确提供要插入的列的列表-请参见上文


你可以使用<强>一个或另一个<强> -但是你不能用< <强> >混合这两个-你不能使用<代码>值(…)<代码>,然后在你的值列表中间有一个<代码>选择< /代码>查询-选择其中的一个-坚持它。

ITVFBIAYIPv4是SCALLER函数或表值函数?表值函数。正如我所说,我从引用的SO文章中运行了create语句,它被自动放在表值函数下。好的,检查我的答案……除了一些小的更改外,其他都有效:INSERT INTO(referer,IP)选择“www.foobar.com/test/”,bin from dbo.itvfBinaryPv4('192.65.68.201')。[切换选择器集中的列名,并将函数参数中的双引号更改为单引号]还想添加如何使用标量值二进制到IP函数进行选择:从foobarYes中选择referer、dbo.fDisplayIPv4(IP)是的。您可以在insert语句中使用此查询-
SELECT referer,dbo.fnDisplayIPv4(IP)FROM foobar