在Openrowset查询中传递Date变量

时间:2016-09-10 23:38:54

标签: sql-server

我有这个Openrowset查询,我可以通过路径获取正确的Excel文件。我无法确定引号的确切数量和/或类型转换

我需要传递一个WHERE语句来获取表中的特定日期。我来自VBA,你放2个引号和2&而且你已经完成了所有的设定。似乎SQL需要数百个! (如果某人有一个关于SQL引用的在线大学的链接,那么也非常感激)

set @sql1 = 'select * 
             FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
                      ''Excel 12.0;Database=' + @filePath1 + '' + ';' + '''' + ',
             ''Select * from [Sheet1$] '''+')' 

exec(@sql1)

我想添加WHERE DATE = @PnLDate

1 个答案:

答案 0 :(得分:0)

该规则与您所知的非常相似,但它适用于单引号'。如果你想在其中一个字符串中使用两个'' 逃避它。除了他们之外,你必须有一个用于开放,一个用于结束。

你显示的字符串有点复杂,因为它包含不必要的空字符串,以及只能为一个结果字符串替换的secuentialy contatenated stirngs。在您的字符串的简化版本下面:

set @sql1 = 'select * 
         FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
             ''Excel 12.0;Database=' + @filePath1 + ';'',
             ''Select * from [Sheet1$] '')'

根据您的要求where可能是:

DECLARE @PnLDate datetime     -- may be varchar instead, if so, must remove convert(....) and use straight @PnLDate
set @PnLDate = '2014/08/01'

set @sql1 = 'select * 
         FROM OPENROWSET(''Microsoft.ACE.OLEDB.12.0'',
             ''Excel 12.0;Database=' + @filePath1 + ';'',
             ''Select * from [Sheet1$] where DATE = #'+     -- hash #  is MS Access delimiter for dates
             convert(varchar(25), @PnLDate, 111) 
             +'#'')'                                        -- results in #2014/08/01#

当您使用"动态SQL"时,请注意您的数据可以在字符串上注入恶意代码。阅读sql Injection