use*_*466 2 sql-server bulk-insert
我运行以下代码,收到语法错误。
SQL Server 2012 Express(版本 11)操作系统:Windows 7 家庭高级版(x64 位)
服务器抱怨我在 附近有语法错误ROWTERMINATOR='\n'
,我无法弄清楚问题的原因是什么。
我不明白如何在批量插入博客中使用引号 '''+@datapath+'access1.log''
我的理解是我应该使用双引号来表示单引号。
这是我的代码:
declare @datapath varchar(128);
set @datapath =
'C:\Users\admin121\sql-server-2014\sql2012_class3_20141028\WebLog\';
exec
('
bulk insert weblog from '''+@datapath+'access1.log''
with
(
firstrow = 1,
FIELDTERMINATOR =' ',
ROWTERMINATOR='\n',
MAXERRORS=99999999
)
');
Run Code Online (Sandbox Code Playgroud)
您需要转义参数中的单引号,例如:
exec
('
bulk insert weblog from '''+@datapath+'access1.log''
with
(
firstrow = 1,
FIELDTERMINATOR ='' '',
ROWTERMINATOR=''\n'',
MAXERRORS=99999999
)
');
Run Code Online (Sandbox Code Playgroud)
使用该PRINT
命令查看该命令之前包含的EXECing
内容:
DECLARE @datapath VARCHAR(260);
SET @datapath = 'C:\some\path';
PRINT
('
bulk insert weblog from ''' + @datapath + '\access1.log''
with
(
firstrow = 1,
FIELDTERMINATOR ='' '',
ROWTERMINATOR=''\n'',
MAXERRORS=99999999
)
');
Run Code Online (Sandbox Code Playgroud)
这提供了以下输出:
从“C:\some\path\access1.log”批量插入博客 和 ( 第一行 = 1, 字段终止符 =' ', ROWTERMINATOR='\n', MAXERRORS=99999999 )
您使用的查询模式被称为“动态 SQL”,由于单引号的问题,可能会出现很多问题,尤其是对于初学者。尝试运行以下命令:
SELECT 'this is a string';
GO
DECLARE @somevar VARCHAR(50);
SET @somevar = 'test';
SELECT 'this is a ' + @somevar + ' test';
GO
DECLARE @somevar VARCHAR(50);
SET @somevar = 'test';
SELECT 'this is a '' + @somevar + '' test';
GO
Run Code Online (Sandbox Code Playgroud)
乍一看,似乎第三个选项应该打印如下内容:
这是一个“测试”测试
但是,输出是:
请注意,第三个结果包括变量的名称,而不是变量的内容。为了使结果正确,我们需要编写如下语句:
DECLARE @somevar VARCHAR(50);
SET @somevar = 'test';
SELECT 'this is a ''' + @somevar + ''' test';
GO
Run Code Online (Sandbox Code Playgroud)
请注意,+ @somevar +
现在用三个单引号括起来了。这相当于编写,实际上是以下内容的简写:
DECLARE @somevar VARCHAR(50);
SET @somevar = 'test';
SELECT 'this is a ' + CHAR(39) + @somevar + CHAR(39) + ' test';
GO
Run Code Online (Sandbox Code Playgroud)
请参阅 Erland Sommarskog 的关于动态 SQL的文章,以获得关于如何使用这个强大但有时令人困惑的功能的最后一个明确的词。
另外,请注意,动态 SQL 尽管功能强大且不可替代,但通过称为 SQL 注入的东西可能成为安全噩梦。请查看此技术网页面,了解有关如何识别和缓解这种情况的详细信息。此外,您可能想在 Duck Duck Go 中搜索“ Little bobby tables ”,它会带您到以下位置:
归档时间: |
|
查看次数: |
419 次 |
最近记录: |