Для каждого цикла перебирать все имена таблиц (SQL) - PullRequest
1 голос
/ 28 июня 2019

У меня есть база данных с похожими таблицами.Каждой таблице присваиваются имена в год, например, с 1997, 1998 по 2019 год. Каждый год будет добавляться новая таблица с соответствующим названием года.В настоящее время я использую приведенный ниже код, чтобы получить счетчик определенного значения в таблице.

Приведенный ниже код вызывается внутри цикла for в приложении ASP.NET, в котором годы хранятся в массиве.Моя проблема заключается в том, чтобы каждый год мне приходилось обновлять массив в ASP.NET для добавленной таблицы на новый год.

Есть ли способ, которым я могу назвать все таблицы в базе данных и передать его в качестве параметра в приведенном ниже коде.

(
  @TableName SysName,
  @SearchInput NVARCHAR(50),
  @SearchParam NVARCHAR(50)
)
AS 
  SET NOCOUNT ON;

  DECLARE @SQL NVARCHAR(MAX) = N'SELECT COUNT(' +
                               QUOTENAME(@SearchParam) +
                               N') FROM ' +
                               QUOTENAME(@TableName) +
                               N' WHERE ' +
                               QUOTENAME(@SearchParam) +
                               N' LIKE ' + 
                               QUOTENAME(@SearchInput, '''') +
                               N';';
EXEC    @return_value = [dbo].[CountSP]
        @TableName = N'1999',
        @SearchParam = N'USERDESC',
        @SearchInput = N'%lol%'

Ответы [ 2 ]

1 голос
/ 28 июня 2019

Вы можете запросить системные представления, чтобы получить все доступные имена таблиц. С помощью некоторой фильтрации вы можете ограничить ее возвращением только этих таблиц года, если в вашей базе данных есть другие таблицы, которые вы хотите пропустить.

SELECT DISTINCT name FROM sys.tables WHERE name LIKE 'Year%'

Предполагается, что ваши таблицы названы: Year2000, Year2001, .... и т. Д. Вы можете редактировать его по мере необходимости.

1 голос
/ 28 июня 2019

Если у вас есть только эти таблицы в вашей базе данных, вы можете использовать

DataTable dt = dbConnection.GetSchema("Table");

, чтобы получить все таблицы, и использовать

 foreach (DataRow dr in dt) {
    string tableName = (string) dr[2];
    /* other code */
}

, чтобы выполнить их итерацию.Если у вас есть и другие таблицы в вашей базе данных, вы можете отсортировать их, проверив, заполняет ли имя таблицы регулярное выражение из 4 чисел или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...