问题描述
我创建了一些代码来检索传递的excel文件表和列名。 然后,我想使用游标将每个工作表名称中的数据插入表中,因为可能有多个工作表。我认为问题在于游标没有正确设置变量@sheetname。问题是什么? 注意:下面的查询已修改,不是我在sql中执行的查询。 我对以下代码有疑问:
----------------Create Excel info table------------------------
DECLARE @SheetNames TABLE (
TABLE_CAT NVARCHAR(50) NULL,TABLE_SCHEM NVARCHAR(50),table_name NVARCHAR(50),TABLE_TYPE NVARCHAR(50),REMARKS NVARCHAR(50)
)
DECLARE @ColNames TABLE (
TABLE_CAT NVARCHAR(30),TABLE_SCHEM NVARCHAR(30),table_name NVARCHAR(30),column_name NVARCHAR(30),data_type SMALLINT,type_name NVARCHAR(30),COLUMN_SIZE INT,BUFFER_LENGTH INT,DECIMAL_DIGITS SMALLINT,NUM_PREC_RADIX SMALLINT,NULLABLE SMALLINT,REMARKS NVARCHAR(254),COLUMN_DEF NVARCHAR(254),sql_DATA_TYPE SMALLINT,sql_DATETIME_SUB SMALLINT,CHAR_OCTET_LENGTH INT,ORDINAL_POSITION SMALLINT,IS_NULLABLE NVARCHAR(254),SS_DATA_TYPE tinyint
)
DECLARE @ExcelInfo TABLE (
SheetName NVARCHAR(50),ColName NVARCHAR(50)
)
DECLARE @FILEPATH NVARCHAR(500) = @Path + '\' + @File;
DECLARE @linkedServerName NVARCHAR(30) = 'x'
-- Remove existing Linked Server (if necessary)
IF EXISTS (SELECT
NULL
FROM sys.servers
WHERE Name = @linkedServerName)
BEGIN
EXEC sp_dropserver @server = @linkedServerName,@droplogins = 'droplogins'
END
EXEC sp_addlinkedserver @server = @linkedServerName,@srvproduct = 'ACE 12.0',@provider = 'Microsoft.ACE.OLEDB.12.0',@datasrc = @FILEPATH,@provstr = 'Excel 12.0;HDR=Yes'
-- Grab the current user to use as a remote login
DECLARE @suser_sname NVARCHAR(256) = 'SA'
-- Add the current user as a login
EXEC sp_addlinkedsrvlogin @rmtsrvname = @linkedServerName,@useself = 'false',@locallogin = @suser_sname,@rmtuser = NULL,@rmtpassword = NULL
-- Return the table/column info
INSERT INTO @SheetNames
EXEC sp_tables_ex @linkedServerName
INSERT INTO @ColNames EXEC sp_columns_ex @linkedServerName
;
WITH a
AS
(SELECT
*
FROM @SheetNames
INSERT INTO @ExcelInfo
SELECT
a.table_name,sn.column_name
FROM @ColNames sn
JOIN a
ON a.table_name = sn.table_name
----------------End of Excel info table creation------------------------
SELECT * FROM @ExcelInfo
WHERE SheetName LIKE '''Er%'
DECLARE @Ericsson_Availability TABLE (
[Date] DATETIME,ElID NVARCHAR(50),ElID1 NVARCHAR(50),[TCH NVARCHAR(10),[TCH2 NVARCHAR(50)
);
DECLARE @SHEETNAME NVARCHAR(500)
BEGIN TRY
DECLARE FetchNames CURSOR LOCAL FOR
SELECT disTINCT
SheetName
FROM @ExcelInfo
WHERE SheetName LIKE '''Er%'
OPEN FetchNames;
FETCH NEXT FROM FetchNames INTO
@SHEETNAME
WHILE @@fetch_status = 0
BEGIN
INSERT INTO @Availability
EXEC ('
SELECT *
FROM Openrowset(''Microsoft.ACE.OLEDB.12.0'',''Excel 12.0 Xml;HDR=YES;Database=' + @FILEPATH + ''',''
SELECT
*
FROM [' + @SHEETNAME + ']
'') oro')
FETCH NEXT FROM FetchNames INTO
@SHEETNAME
END
CLOSE FetchNames
DEALLOCATE FetchNames
SELECT
*
FROM @Availability;
END TRY
BEGIN CATCH
PRINT ERROR_LINE()
PRINT ERROR_MESSAGE()
PRINT ERROR_STATE()
END CATCH
END;
解决方法
我找到了解决方法! 关于字符串串联的概念。 在插入cod的(openrowset)部分之前,我应该使用replace函数,以便在openrowset部分要运行之前和之后以单引号的方式更改@sheetname的值。像这样的东西:
SET @SHEETNAME = REPLACE(@SHEETNAME,``'',``'''')