SQL查询中的变量
我想将包含多个文本文件的目录插入SQL数据库。因为我有多个文件,所以我想使用一个循环来逐个获取所有文件。我在查询中使用变量时遇到问题。以下是我的疑问:SQL查询中的变量,sql,sql-server,tsql,variables,Sql,Sql Server,Tsql,Variables,我想将包含多个文本文件的目录插入SQL数据库。因为我有多个文件,所以我想使用一个循环来逐个获取所有文件。我在查询中使用变量时遇到问题。以下是我的疑问: DECLARE @i int = 1 DECLARE @file AS nvarchar(MAX) WHILE(@i<=50) BEGIN SET @file = 'C:\Users\Barry\Desktop\Output\output' + cast(@i as varchar(2)) + '.txt'; INSERT INT
DECLARE @i int = 1
DECLARE @file AS nvarchar(MAX)
WHILE(@i<=50)
BEGIN
SET @file = 'C:\Users\Barry\Desktop\Output\output' + cast(@i as varchar(2)) + '.txt';
INSERT INTO dbo.Table
SELECT book.*
FROM OPENROWSET (BULK (@file), SINGLE_CLOB) as j
CROSS APPLY OPENJSON(BulkColumn)
WITH (Id int N'$.id', BookId int N'$.book_id') AS book
SET @i = @i +1;
END
错误消息:无法批量加载。文件“@file”不存在。
我正在使用SQL server 2016尝试使用动态SQL,因为您正在
OPENROWSET中使用参数
DECLARE @i int = 1
DECLARE @file AS nvarchar(MAX)
DECLARE @sql VARCHAR(max)
WHILE(@i<=50)
BEGIN
SET @file = 'C:\Users\Barry\Desktop\Output\output' + cast(@i as varchar(2)) + '.txt';
SET @sql = '
INSERT INTO dbo.[Table]
SELECT book.*
FROM OPENROWSET (BULK ''' + @file + ''', SINGLE_CLOB) as j
CROSS APPLY OPENJSON(BulkColumn)
WITH (Id int N''$.id'', BookId int N''$.book_id'') AS book'
EXEC(@sql)
SET @i = @i +1;
END
声明@i int=1
将@file声明为nvarchar(最大值)
声明@sql VARCHAR(最大值)
虽然(@iAnd是否所有50个文件都存在?同一台计算机的桌面上的文件是否运行SQL Server?您是否可以使用确切的文件名共享示例文件路径?例如@Lamak,它们存在。我确信。您是否尝试过UNC路径?而不是执行插入,只需打印所有50个文件并确保首先运行循环。旁注,我99%确定您必须使用OPENROWSET动态SQL…我在行中遇到以下错误:WITH(Id int N'$.Id',BookId int N'$.book_Id'))正如书中所说,“$”附近的语法不正确。我忘了转义…转义后立即检查,@sql块中有多个语法错误。请先打印@sql,粘贴它,然后查看出现了什么错误。那么,您的表名为table@BarryStotter吗?如果不是,您必须将其更改为实际的表名…正在运行的命令isINSERT INTO dbo.Table SELECT book.*从OPENROWSET(BULK('C:\Desktop\Output1.txt'),SINGLE\u CLOB)作为j交叉应用OPENJSON(BulkColumn)和(Id int N'$.Id',BookId int N'$.book\u Id'))作为book
。您的代码中将其作为dbo.Table。如果此语句本身不起作用,它将不会在循环中起作用。请确保您可以先执行一次插入。但是,对于所有50个语句,您都需要动态sql,这是我根据您的代码提供的。
DECLARE @i int = 1
DECLARE @file AS nvarchar(MAX)
DECLARE @sql VARCHAR(max)
WHILE(@i<=50)
BEGIN
SET @file = 'C:\Users\Barry\Desktop\Output\output' + cast(@i as varchar(2)) + '.txt';
SET @sql = '
INSERT INTO dbo.[Table]
SELECT book.*
FROM OPENROWSET (BULK ''' + @file + ''', SINGLE_CLOB) as j
CROSS APPLY OPENJSON(BulkColumn)
WITH (Id int N''$.id'', BookId int N''$.book_id'') AS book'
EXEC(@sql)
SET @i = @i +1;
END