Sql表名中的通配符动态创建

时间:2018-03-20 15:48:27

标签: sql sql-server

我使用查询字符串动态循环表名。现在我需要在表名中添加一个通配符,以便它获取我得到的新表。以下示例

WHILE @Year_Id <= 2018
    BEGIN
      SET @YearVar = CONVERT(varchar(4), @Year_Id)
      SET @TABLENAME = '[SWDI].[dbo].[hail-'+@YearVar+']'
      SET @SQLQUERY = 'SELECT CELL_ID, LAT, LON, SEVPROB, PROB, MAXSIZE, 
      _ZTIME'+
     ' from '+@TABLENAME+

所以我的早期表格是hail-2001,hail-2002,hail-2003至2017.现在我得到名为hail-201801,hail-201802的表格。

我想在调用桌子时将额外的01,02作为外卡加入。 非常感谢您的帮助。我是新手。

2 个答案:

答案 0 :(得分:3)

呃,不,不。您显然无法完全了解表在数据库或SQL Server中的工作方式。

通过使多个表具有完全相同的列和类型并且其名称由数字或日期区分,您获得 nothing 。这不是SQL的工作原理。您失去了很多:外键引用,查询简单性,可维护性等。

相反,请在数据中包含日期列,并将所有内容存储在一个表中。

如果您担心性能,则可以在日期列上创建索引以获取所需的数据。另一种方法(如果数据很大)是将数据存储在单独的数据分区中。 These are an important part of SLQ Server functionality

答案 1 :(得分:0)

作为一般解决方案,您可以执行以下操作:

SET @TableName = '[SWDI].[dbo].[hail-'+@YearVar+']';

-- Check if the year table exists
IF (OBJECT_ID(@TableName, 'U') IS NULL) BEGIN
  -- Implement your 'wildcard' logic here
  SET @NumVar = '01';
  SET @TableName = '[SWDI].[dbo].[hail-'+ @YearVar + @NumVar']';
END

另一种解决方案是将缺失的编号表作为现有表格顶部的视图,但这可能会产生负面的性能影响。

第三个是在新编号表的基础上拥有年度视图,对表和视图定义有明智的约束,这可能会产生微不足道的开销。

最后但并非最不重要的是,您应该考虑在这些表之上构建分区视图并维护该视图。您可以直接查询视图,而无需一直弄乱表名。

请阅读戈登的回答!

在任何情况下,我都建议小心动态查询。您可能需要查看PARSENAMEQUOTENAME等函数。