2011-06-03 197 views
1

我需要帮助的查询。在我的查询中,我想通过我的表名作为参数。这是我的查询:需要帮助与sql查询

SELECT DISTINCT 
    CONVERT (varchar, InspectDateTime) AS 'Inspect Date Time', 
    CONVERT (varchar, SynDateTime) AS 'Sync Date Time', 
    Employee, 
    ROUND(OverAllPercentage, 2) AS Grade 
FROM 
    Table_Name 
WHERE 
    (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
    BETWEEN 
     DATEADD(dd, DATEDIFF(dd, 0, @From), 0) AND 
     DATEADD(dd, DATEDIFF(dd, 0, @To), 0)) 
ORDER BY 
    'Inspect Date Time' 

在这里,我想通过Table_Name作为参数。请注意,这个查询已经以两个aurguments作为参数,即"@From“和” @To

问候 阿卜杜拉

+3

你正在使用哪个数据库? (动态sql的生成不同于db到db) – davek 2011-06-03 06:46:12

+0

请注意,您的order by子句将按字母顺序排序日期。这是你的意图吗? – 2011-06-03 07:21:21

回答

3

如果您正在使用MS SQL工作,你可以这样做:

CREATE PROCEDURE sp_GetMyStuff 
(
    @From datetime, 
    @To datetime, 
    @TableName nvarchar(100) 
) 
AS 

exec('  
    SELECT DISTINCT 
     CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', 
     CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', 
     Employee, 
     ROUND(OverAllPercentage, 2) AS Grade 
    FROM 
     ' + @TableName + ' 
    WHERE 
     (DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) 
     BETWEEN 
      DATEADD(dd, DATEDIFF(dd, 0, ' + @From + '), 0) AND 
      DATEADD(dd, DATEDIFF(dd, 0, ' + @To + '), 0)) 
    ORDER BY 
     1 
'); 

,然后叫它

sp_GetMyStuff '2011-05-05', '2011-06-05', 'TBL_MYTABLE' 
+0

我不记得我的头顶。你可以使用+ concat字符与日期时间和varchar?我会猜不到,但我从记忆中不能确定。 – RThomas 2011-06-03 07:01:27

+0

它就像一个魅力!我们在说话时使用这个。 – balexandre 2011-06-03 07:25:19

+0

嗨Balexandre,谢谢你的帖子。在将@From和@To转换为varchar后,它工作得很好。 – Abdullah 2011-06-05 11:12:25

3

在SQL Server中,如果你想‘参数多态’的表名,您必须使用动态SQL

如果是这样,你必须阅读厄兰的The Curse and Blessing of dynamic SQL作为一个前奏。

因此,基本上,你需要建立你的SQL语句作为字符串,然后执行它。该re是没有其他方式在SQL Server T-SQL语句中“参数化”表名。

+0

+1链接!有书签 – davek 2011-06-03 06:53:24

+0

感谢马克您的评论:) – Abdullah 2011-06-05 11:23:15

3

OK,假设你使用SQL Server(由DATEADDDATEDIFF功能判断),你需要

  1. 构建串联SQL命令 作为字符串(注意不要让 SQL注入:也就是说,你应该通过查找 可能的名字形成 information_schema和验证 等检查 您table_name变量是 有效的表名)

  2. 执行使用 sp_executesql您的动态SQL:http://msdn.microsoft.com/en-us/library/ms188001.aspx

+0

+1这个答案链接到sp_executesql。由于海报不仅要查询动态表,还要传递日期参数以及sp_executesql是唯一的方法。该链接解释了如何将@From和@To传入动态语句。 – RThomas 2011-06-03 06:55:44

+0

谢谢davek您的评论:) – Abdullah 2011-06-05 11:23:41

0

谢谢balexandre。小修改(铸造@ From,@ To into varchar)后的最终查询是:

CREATE PROCEDURE sp_GetMyStuff 

@TableName VARCHAR(128), 
@From DATETIME, 
@To DATETIME 

AS 

DECLARE @sql VARCHAR(4000) 
SELECT @sql = 'SELECT DISTINCT CONVERT (varchar, InspectDateTime) AS ''Inspect Date Time'', CONVERT (varchar, SynDateTime) AS ''Sync Date Time'', Employee, ROUND(OverAllPercentage, 2) AS Grade 
FROM ' + @TableName + ' 
WHERE 
(DATEADD(dd, DATEDIFF(dd, 0, InspectDateTime), 0) BETWEEN DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@From AS VARCHAR(100)) +'''), 0) 
AND DATEADD(dd, DATEDIFF(dd, 0,'''+ CAST(@To AS VARCHAR(100)) +'''), 0)) 
ORDER BY ''Inspect Date Time''' 
EXEC (@sql) 

GO 
+0

如果您发布代码,XML或数据样本,请**在文本编辑器中突出显示这些行,然后单击编辑器工具栏上的“代码示例”按钮(“{}”)以精确地设置格式并使其语法突出显示! – 2011-06-05 11:24:10