2015-09-08 23 views
1

我正在运行链接查询,并且我很难将注入计算的变量注入OPENQUERY调用。在OpenQuery调用中使用datetime变量转换失败

我已经找到了一些解决方案在这里对堆栈溢出,似乎指向一个数据类型不匹配,但我不能复制OPENQUERY呼叫之外的错误,所以它的混乱给我。

这里是有问题的查询:

SELECT name 
FROM OPENQUERY ([OLTP\SQL2014], 
'USE master; DECLARE @FROMDATE datetime2(7) = dateadd(dd, -10, Sysdatetime());  
DECLARE @ToDate datetime2(7) = sysdatetime(); 
EXEC (''SELECT name from sys.tables 
    INNER JOIN sys.partitions 
     ON sys.tables.object_id = sys.partitions.object_id 
WHERE sys.tables.create_date BETWEEN '''' + @FromDate + '''' AND '''' + @ToDate + 
    '''' AND sys.tables.name LIKE ''''%EXCEPTION%'''' 
    AND NOT sys.tables.name LIKE ''''%AUDIT'''' 
    AND sys.partitions.rows <> 0 '')' 
) 

我需要放弃内部OPENQUERY使用的变量?

+0

你为什么要使用SYSDATETIME当你声明与datetime数据类型的变量? – CPMunich

+0

经常进行更精确的测量(与GetDate()相反)。任何理由我不应该? –

+0

当然,但你可能想使用datetime2(7)数据类型而不是datetime – CPMunich

回答

2

而不是使用丑陋的字符串连接和EXEC使用参数化EXEC sp_executesql像:

SELECT name 
FROM OPENQUERY ([OLTP\SQL2014], 
    'USE master; 
    DECLARE @FromDate DATETIME = DATEADD(dd, -10, SYSDATETIME());  
    DECLARE @ToDate DATETIME = SYSDATETIME(); 
    DECLARE @sql NVARCHAR(MAX) = 
     N''SELECT name 
      FROM sys.tables 
      JOIN sys.partitions 
      ON sys.tables.object_id = sys.partitions.object_id 
      WHERE sys.tables.create_date BETWEEN @FromDate AND @ToDate 
      AND sys.tables.name LIKE ''''%EXCEPTION%'''' 
      AND NOT sys.tables.name LIKE ''''%AUDIT'''' 
      AND sys.partitions.rows <> 0''; 

    EXEC [dbo].[sp_executesql] 
     @sql 
     ,N''@FromDate DATETIME, @ToDate DATETIME'' 
     ,@FromDate 
     ,@ToDate; 
'); 

编辑:

SELECT name 
FROM OPENQUERY ([OLTP\SQL2014], 
    'USE master; 
    DECLARE @FromDate DATETIME = DATEADD(dd, -10, SYSDATETIME());  
    DECLARE @ToDate DATETIME = SYSDATETIME(); 

    EXEC [dbo].[sp_executesql] 
     N''SELECT name 
      FROM sys.tables 
      JOIN sys.partitions 
      ON sys.tables.object_id = sys.partitions.object_id 
      WHERE sys.tables.create_date BETWEEN @FromDate AND @ToDate 
      AND sys.tables.name LIKE ''''%EXCEPTION%'''' 
      AND NOT sys.tables.name LIKE ''''%AUDIT'''' 
      AND sys.partitions.rows <> 0'' 
     ,N''@FromDate DATETIME, @ToDate DATETIME'' 
     ,@FromDate 
     ,@ToDate; 
'); 
+0

我喜欢它。当我尝试运行它时,它给了我几个错误。 '必须声明标量变量“@sql”.'和'不正确语法附近'AND sys.partitions.rows <> 0' –

+0

@SeanLong查看我更新的答案并检查第一个问题是否消失 – lad2025

+0

它是,但现在有错误'过程期望类型为'ntext/nchar/nvarchar'的参数'@params'。我会玩它。我怀疑我可以CAST datetype作为其中之一,并且仍然做比较。 –