sql-server - 使用动态 T-SQL 插入 OPENROWSET 语法

标签 sql-server tsql

我感觉我已经在线阅读了关于如何从 T-SQL 脚本动态创建 Excel 输出的每一页。这是我所拥有的:

Use Master
GO

EXEC master.dbo.sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 1
RECONFIGURE WITH OVERRIDE
GO

EXEC sp_configure 'ad hoc distributed queries', 1
RECONFIGURE
GO

EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 1
GO

EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 1
GO

USE CommercialLending
GO
DECLARE @LoopCounter TINYINT = 1
DECLARE @LoopMaxCount TINYINT = (SELECT COUNT(DISTINCT OFFICER)
                                FROM CommercialLending.dbo.CMLTrial)
WHILE (1=1)
BEGIN
DECLARE @OfficerName VARCHAR(4000) = (
                                    SELECT OFFICER 
                                    FROM (SELECT DISTINCT OFFICER, ROW_NUMBER() OVER (ORDER BY OFFICER) AS rownumber 
                                            FROM CommercialLending.dbo.CMLTrial GROUP BY Officer) AS OFFICER 
                                    WHERE rownumber = @LoopCounter)
DECLARE @FileName varchar(400) = @OfficerName+ '.xlsx'
DECLARE @FullFileName varchar(400) = 'O:\MIS\Python\Programs\CommercialLending\'+@FileName
DECLARE @CopyFile varchar(800) = 'copy O:\MIS\Python\Programs\CommercialLending\Template.xlsx copy O:\MIS\Python\Programs\CommercialLending\' + @FileName
EXEC xp_cmdshell @CopyFile
DECLARE @sql nvarchar(4000)
SET @sql = 'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',Excel 12.0;Database='+@FullFileName+';'',''SELECT * FROM [Sheet1$])'' SELECT * FROM dbo.CMLTrial WHERE Officer='''+@OfficerName+''
EXEC (@sql)
SET @LoopCounter = @LoopCounter+1
IF (@LoopCounter > @LoopMaxCount)
    BREAK;
END

Use Master
GO

EXEC master.dbo.sp_configure 'xp_cmdshell', 0
RECONFIGURE WITH OVERRIDE
GO

EXEC sp_configure 'ad hoc distributed queries', 0
RECONFIGURE
GO

EXEC master.dbo.sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO

EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'AllowInProcess' , 0
GO

EXEC master . dbo. sp_MSset_oledb_prop N'Microsoft.ACE.OLEDB.12.0' , N'DynamicParameters' , 0
GO

我知道我的问题出在将 INSERT INTO OPENROWSET 字符串分配给 @sql 变量的行中:

SET @sql = 'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',Excel 12.0;Database='+@FullFileName+';'',''SELECT * FROM [Sheet1$])'' SELECT * FROM dbo.CMLTrial WHERE Officer='''+@OfficerName+''

我这辈子都搞不清楚我的语法错误在哪里。有人可以帮我弄清楚吗,如果可能的话,还可以提供一个指南来弄清楚将 INSERT INTO OPENROWSET 用作变量中的字符串的标准语法吗?

最佳答案

试试这个:

    SET @sql = 'INSERT INTO OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0;Database='+@FullFileName+''',''SELECT * FROM [Sheet1$]'') SELECT * FROM dbo.CMLTrial WHERE Officer LIKE '''+@OfficerName+''''

在使用动态脚本时,我总是执行 PRINT @sql 以查看实际查询的外观。故障排除更容易,以后我也省去了很多麻烦。

关于sql-server - 使用动态 T-SQL 插入 OPENROWSET 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25753278/

相关文章:

sql - EXEC sp_executesql 未按预期工作

NULL 和 VARCHAR 之间的 SQL 并集错误

sql - 拒绝特定字符

sql - EF Core 检查约束

sql-server - 如何在SQL函数中插入插入语句?

sql-server-2008 - 计算两个日期之间的天数,然后按月求和并分组

sql - Sybase IQ - 如何在不换行的情况下显示存储过程?

python - PYODBC:无法通过 SQL 查询进行迭代

sql-server - 使用sql分割字母和数字

sql - 添加计算项 - SQL Server 2008R2