Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL查询中的变量_Sql_Sql Server_Tsql_Variables - Fatal编程技术网

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

我想将包含多个文本文件的目录插入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 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吗?如果不是,您必须将其更改为实际的表名…正在运行的命令is
INSERT 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