Имя таблицы как переменная

ОК, поэтому вы хотите прочитать подматрицу размера n x m , начиная с позиций x , y в большой матрице размера p x q . Вам нужно две вещи:

  1. (убедитесь, что x + n & lt; = p и y + m & lt; = q )
  2. перейти к первому элементу матрицы, которую вы хотите прочитать. Для этого нужно сначала пропустить первый y - 1 ряд
  3. пропустить x - 1 элемент из следующей строки, затем прочитать n в вашу подматрицу. Повторите m раз.

Ваша текущая реализация начинает чтение с самого первого элемента матрицы, а затем читает элементы смежно в подматрицу. Обновленная версия:

FILE *sample = fopen("randomfile.txt", "r");
// skip the first y-1 rows
for (i = 0; i < y - 1; i++) {
  fscanf(sample, "%*[^\n]\n", &matrix[i][j]);
}
for (i = 0; i < m; i++) {
  // skip the first x-1 numbers
  for (j = 0; j < x - 1; j++) {
     fscanf(sample, "%*f");
  }
  // read n numbers
  for (j = 0; j < n; j++) {
     fscanf(sample, "%f", &matrix[i][j]);
  }
  if (x + n < p) {
    // consume the rest of the line
    fscanf(sample, "%*[^\n]\n");
  }
}
fclose(sample);

Обновление: для чтения подматрицы из массива вместо этого еще проще, просто требуется немного больше вычислений. Суть заключается в том, что матрица размера p x q может быть сохранена в смежной матрице размера p x q , так что матрица [i, j] может быть прочитана из массива [i * (j-1) + j] (приблизительно - могут быть ошибки «по очереди», и я никогда не уверен, который является столбцом, и который является строка, но, надеюсь, вы получите идею: -)

Таким образом, код будет похож на

for (i = 0; i < m; i++) {
  for (j = 0; j < n; j++) {
     submatrix[i][j] = array[(y + i) * p + x + j];
  }
}
143
задан Imran Ali Khan 24 June 2015 в 11:35
поделиться

3 ответа

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

Более подробная информация здесь: Проклятие и благословение динамического SQL

116
ответ дан 23 November 2019 в 22:10
поделиться

Вы не можете использовать имя таблицы для переменной, вам придется сделать это вместо этого:

DECLARE @sqlCommand varchar(1000)
SET @sqlCommand = 'SELECT * from yourtable'
EXEC (@sqlCommand)
37
ответ дан 23 November 2019 в 22:10
поделиться

Вам необходимо динамически сгенерировать sql:

declare @tablename varchar(50) 

set @tablename = 'test' 

declare @sql varchar(500)

set @sql = 'select * from ' + @tablename 

exec (@sql)
14
ответ дан 23 November 2019 в 22:10
поделиться
Другие вопросы по тегам:

Похожие вопросы: