Можете ли вы использовать SQLParameter в операторе SQL FROM? - PullRequest
3 голосов
/ 04 февраля 2011

Я пытаюсь создать параметризованный запрос в C # к базе данных сервера SQL.

Код:

        query = new StringBuilder( "SELECT @fields FROM @tables");

        using(SqlConnection connection = new SqlConnection(connection))
        {
            SqlCommand command = new SqlCommand(query.ToString(), connection);
            command.Parameters.AddWithValue("@fields", fields.ToString());
            command.Parameters.AddWithValue("@tables", tables.ToString());

            try
            {
                connection.Open();
                Int32 rowsAffected = command.ExecuteNonQuery();
                Console.WriteLine("RowsAffected: {0}", rowsAffected);
            }
            catch(Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }

Странно то, что происходит сбой с сообщением "Необходимо объявить переменную таблицы \" @ tables \ ". Однако, как вы можете видеть, он был четко определен.

Итак, мой вопрос:

  1. Можете ли вы передать параметр для определения списка таблиц в операторе FROM?
  2. Если вы можетепочему это не работает?

Ответы [ 4 ]

7 голосов
/ 04 февраля 2011

SQL не поддерживает предложение FROM для параметризации. Поэтому вы должны использовать либо динамический SQL, либо создать / объединить строку запроса перед отправкой ее в базу данных.

2 голосов
/ 04 февраля 2011

К сожалению, вы не можете использовать параметр в предложении FROM.

1 голос
/ 04 февраля 2011

Я думаю, что команда SQL и ее параметры не должны выглядеть так.Он должен выглядеть следующим образом:

SELECT fieldName1, fieldName2
FROM   TableName
WHERE  fieldName = @paramName

Вы не можете использовать параметры в качестве определения полей для выбора или целевой таблицы.Если вам нужно определить поля для выбора, просто составьте командную строку в StringBuilder, прежде чем вызывать ее - как вам нужно.Параметры используются для целей фильтрации.В вашем случае вам не нужны никакие параметры, просто соберите команду и выполните.

0 голосов
/ 04 февраля 2011

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

Это только для иллюстрации - для реальной жизни, очевидно, вам нужно сделать это намного чище:

declare @TABLE_NAME nvarchar(128)
set @TABLE_NAME = 'Robert'');DROP TABLE Students;--' -- This line will raise an error
set @TABLE_NAME = 'BOOK' -- This line will go through properly

declare @sql varchar(max)
set @sql = 'SELECT * FROM '

if exists (select 1 from sys.objects where type = 'U' and name = @TABLE_NAME)
    begin
        set @sql = @sql + @TABLE_NAME
        exec (@sql)
    end
else
    begin
        raiserror ('ERROR ERROR ERROR', 0, 0)
        return
    end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...