sql-server - 变量应该被声明
问题描述
我正在使用 T-SQL。目标是将多个文件插入数据库。如果我在没有循环的情况下使用,它工作正常。
在循环中,我总是收到此错误:
@InputXML 应该被声明
我的代码:
IF OBJECT_ID('TEMPDB..#TEMP_FILES') IS NOT NULL
DROP TABLE #TEMP_FILES
CREATE TABLE #TEMP_FILES
(
FileName VARCHAR(MAX),
DEPTH VARCHAR(MAX),
[FILE] VARCHAR(MAX)
)
INSERT INTO #TEMP_FILES
EXEC master.dbo.xp_DirTree '\\MyServer\MyFolder\',1,1
DELETE FROM #TEMP_FILES WHERE RIGHT(FileName,4) != '.XML'
--
SET QUOTED_IDENTIFIER ON
GO
TRUNCATE Table MyTable2
DECLARE @InputXML XML
DECLARE @FILENAME VARCHAR(MAX),@SQL VARCHAR(MAX)
WHILE EXISTS(SELECT * FROM #TEMP_FILES)
BEGIN
SET @FILENAME = (SELECT TOP 1 FileName FROM #TEMP_FILES)
SET @sql = 'SELECT @InputXML = CAST(x AS XML) FROM OPENROWSET(BULK \\MyServer\MyFolder\'''+ @FILENAME +''', SINGLE_BLOB) AS T(x)
INSERT INTO MyTable2 ([id],[version], [name], [listId], [listCode])
SELECT
product.value(''(@id)[1]'', ''NVARCHAR(10)''),
product.value(''(@version)[1]'', ''NVARCHAR(14)''),
product.value(''(name[1])'', ''NVARCHAR(255)''),
product.value(''(listId[1])'', ''NVARCHAR(9)''),
product.value(''(listCode[1])'', ''NVARCHAR(10)'')
FROM @InputXML.nodes(''xxx/values/value'') AS X(product)'
EXEC(@SQL)
DELETE FROM #TEMP_FILES
WHERE FileName = @FILENAME
END
解决方案
您需要在动态 SQL 中声明变量(不应该nvarchar
)varchar
。您还应该使用QUOTENAME
以确保文件名没有问题:
DECLARE @sql nvarchar(max) = N'
DECLARE @InputXML XML;
SELECT @InputXML = CAST(x AS XML) FROM OPENROWSET(BULK ' + QUOTENAME(N'\\MyServer\MyFolder\' + @FILENAME, '''') + N', SINGLE_BLOB) AS T(x)
INSERT INTO MyTable2 ([id],[version], [name], [listId], [listCode])
SELECT
product.value(''(@id)[1]'', ''NVARCHAR(10)''),
product.value(''(@version)[1]'', ''NVARCHAR(14)''),
product.value(''(name[1])'', ''NVARCHAR(255)''),
product.value(''(listId[1])'', ''NVARCHAR(9)''),
product.value(''(listCode[1])'', ''NVARCHAR(10)'')
FROM @InputXML.nodes(''xxx/values/value'') AS X(product)'
不过,我会说,我敦促您找到另一种将文件加载到 SQL Server 中的方法。不建议使用Dynamic OPENROWSET
,尤其是来自用户输入的。批量插入或 BCP 可能是一种选择。
推荐阅读
- php - 调整回头客下方的文字
- python - 网页抓取:从 javascript 链接下载 pdf
- angular - 带有意外令牌的 Angular 4 Prod 构建中的错误
- asp.net - 合并冲突 - 出现奇怪的字符
- scala - 如何在不使用 http 请求中的主机标头的情况下获取服务器名称
- sql-server - springboot中如何访问两个SQl服务器
- java - 根据 Java 环境变量中的值创建使用 @JsonIgnore 的自定义注释
- node.js - 在 async/await Express 路由器中使用 MongoDB 客户端的正确方法
- azure - 如何在 Azure 虚拟网络上限制出站连接到 URL 而不是 IP 地址?
- matlab - 矩阵的第一个非单维究竟是什么?