【问题标题】:Syntax issue in SQL Server, using OPENROWSETSQL Server 中的语法问题,使用 OPENROWSET
【发布时间】:2014-07-16 20:47:21
【问题描述】:

我正在尝试执行一个需要将变量传递给它的存储过程。一个是静态的,另一个是动态的。

DECLARE @Filt DATETIME 
SET @Filt = (SELECT DISTINCT MAX(Date) FROM Data.db.Staging)
SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14  \MSSQL2012;Trusted_Connection=yes;', 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt ')

但这不起作用,返回错误 “消息 8180,第 16 级,状态 1,第 1 行 无法准备报表。 消息 102,第 15 级,状态 1,第 1 行 '@Filt' 附近的语法不正确。”

我猜这是因为 Filt 是动态语句。所以我尝试了这个

DECLARE @FilterData DATETIME
DECLARE @sql VARCHAR(200) 
SET @Filt = (SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
SET @sql = 'EXEC GetData.db.Staging @Mode = ''Date'' @Filt =  '  + @Filt

SELECT * INTO #tempData FROM OPENROWSET('SQLNCLI', 'Server=ISR14\MSSQL2012;Trusted_Connection=yes;',
 @sql)

但是我收到了消息

“消息 102,级别 15,状态 1,第 24 行 '@sql' 附近的语法不正确。”

似乎 OPENROWSET 只能接受字符串。但我想传递一个动态的变量。

【问题讨论】:

    标签: sql sql-server tsql concatenation openrowset


    【解决方案1】:

    您必须将整个语句放入一个变量中并运行它,并将@FilterData 转换为一个varchar 来连接它。

    您不能在 openquery/openrowset 中使用变量。

    试试这个并检查打印输出......如果它工作并且看起来没问题,然后执行(@sql2)

    DECLARE @FilterData DATETIME
    DECLARE @sql VARCHAR(200), @sql2 VARCHAR(500)
    SET @FilterData = '2014-07-01'--(SELECT DISTINCT MAX(AsOfDate) FROM Data.db.Staging)
    SET @sql = 'EXEC GetData.db.Staging @Mode = ''''Date'''', @Filt =  '''''  + CONVERT(VARCHAR(20),@FilterData ,120) + ''''''
    
    SET @sql2 = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14\MSSQL2012;Trusted_Connection=yes;'',
     '''+@sql+''')'
    
    print @sql2
    --exec(@sql2)
    

    【讨论】:

    • 这绝对有帮助!但是,我现在遇到了这个问题:Msg 102, Level 15, State 1, Line 2 “2014”附近的语法不正确。消息 105,级别 15,状态 1,第 2 行字符串 ')' 后的未闭合引号。
    • 已更新,缺少,。不过,我没有看到任何未闭合的引号。你解决了吗?
    【解决方案2】:

    您需要使整个查询动态化,不确定我是否确定了它,但类似于:

    DECLARE @Filt DATETIME 
           ,@sql VARCHAR(MAX)
    SET @Filt = (SELECT MAX(Date) FROM Data.db.Staging)
    SET @sql = 'SELECT * INTO #tempData FROM OPENROWSET(''SQLNCLI'', ''Server=ISR14  \MSSQL2012;Trusted_Connection=yes;'', ''EXEC GetData.db.Staging @Mode = ''''Date''' +@Filt+ ')'
    EXEC (@sql)
    

    【讨论】:

    • 这绝对有帮助!但是,我现在遇到了这个问题:Msg 102, Level 15, State 1, Line 2 “2014”附近的语法不正确。消息 105,级别 15,状态 1,第 2 行字符串 ')' 后面的非闭合引号。其中 2014 年是 @Filt 中的 MAX 日期的一部分
    • @user3259896 你能告诉我一个使用硬编码值而不是动态版本执行的字符串吗?我只是不确定EXEC GetData.db.Staging @Mode = ''''Date''' +@Filt+ ') 应该如何结构化。
    猜你喜欢
    • 2011-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多