Пара вопросы
Во-первых, вам не нужно (имя таблицы)
SET @sql = 'DELETE FROM ' + @TABLE_NAME + etc.
В общем, вы должны попытаться включить соответствующий префикс Schema
SET @sql = 'DELETE FROM dbo.' + @TABLE_NAME + etc.
И в случае, если ваше имя таблицы имеет специальные символы, возможно, оно должно быть заключено в скобки
SET @sql = 'DELETE FROM dbo.[' + @TABLE_NAME + ']' + etc.
Поскольку @Value - это строка, вы должны окружать ее одинарными кавычками при вычислении значения для @SQL. Чтобы вставить апостроф в строку, вы должны избежать этого, используя две одинарные кавычки, например:
SET @SQL = 'DELETE FROM dbo.[' + @TABLE_NAME + '] WHERE [' + @COLUMN_NAME + '] = '''' + @VALUE + ''''
Если @VALUE сама содержит апостроф, вся эта вещь сломается, так что вам нужно бежать, что а
SET @SQL = 'DELETE FROM dbo.[' + @TABLE_NAME + '] WHERE [' + @COLUMN_NAME + '] = '''' + REPLACE(@VALUE,'''','''''') + ''''
также @@ ROWCOUNT не заселить от EXEC
. Если вы хотите, чтобы иметь возможность читать @@ ROWCOUNT, используйте sp_executesql вместо
EXEC sp_ExecuteSql @SQL
И, наконец, позвольте мне тенденциозно интерпретировать материал для minute--
Этот вид хранимой процедуры не является прекрасной идеей. Я знаю, что это довольно круто, потому что оно гибкое, и такое мышление обычно разумно, когда дело доходит до других языков, но в мире базы данных этот подход вызывает проблемы, например. есть проблемы с безопасностью (например, инъекция и тот факт, что вам нужны повышенные привилегии для вызова sp_executeSql), и там возникают проблемы с предварительной компиляцией/производительностью (поскольку SQL не известно заранее, SQL Server должен будет генерировать новый план запросов каждый и каждый раз, когда вы это называете), и поскольку вызывающий может предоставить любое значение для имени таблицы и столбца, вы не знаете, будет ли этот оператор удаления эффективным и использовать индексы, или если это вызовет огромную проблему с производительностью, потому что таблица большая, а столбец не индексируется.
Правильный подход состоит в том, чтобы иметь ряд соответствующих хранимых процедур с строго типизированными входами, которые являются специфическими для каждого случая использования данных, где вам нужно удалить на основе критериев. Инженеры базы данных не должны пытаться сделать вещи гибкими; вы должны заставить людей задуматься о том, что именно они понадобятся, и реализовать это и только это. Это единственный способ обеспечить, чтобы люди следовали правилам, сохраняя неизменное R/I, эффективное использование индексов и т. Д.
Да, это может показаться повторяющейся и избыточной работой, но c'est la vie. Существуют средства для генерации кода для операций CRUD, если вам не нравится дополнительная набрав.
Ожидается, что принятый ответ на [этот связанный вопрос] (http://stackoverflow.com/questions/2838490/table-name-as-variable) будет вдохновлять. Посетите [link] (http://www.sommarskog.se/dynamic_sql.html) в ответе для более подробной информации. –
Что случилось с вашей текущей процедурой? – FLICKER
Я не думаю, что '@@ ROWCOUNT' работает в этом контексте. Вам понадобится это, чтобы выполнить и передать из динамического оператора SQL. Вот почему вы должны использовать 'sp_executesql', потому что вы можете легко передавать данные в _and_ из динамического SQL. – Nicarus