#sql #sql-server #tsql #stored-procedures #parameter-passing
#sql #sql-сервер #tsql #хранимые процедуры #передача параметров
Вопрос:
Я хочу запустить скрипт проверки по столбцам для всех таблиц в базе данных в MS SQL SERVER. Мой запрос сейчас выглядит примерно так:
CREATE PROCEDURE [dbo].[DDS1718_Validation]
AS
BEGIN
SET FMTONLY OFF
DECLARE @ActualTableName AS NVarchar(255)
SELECT @ActualTableName =QUOTENAME(TABLE_NAME )
FROM INFORMATION_SCHEMA.TABLES
однако при этом выбирается вывод только для одной таблицы.
Спасибо.
Комментарии:
1. почему бы не выбрать из INFORMATION_SCHEMA.COLUMNS и не получить все таблицы и все столбцы? что вы пытаетесь сделать?
2. Вы ищете SELECT @ActualTableName = ISNULL(@ActualTableName, «) QUOTENAME(ИМЯ_ТАБЛИЦЫ) ИЗ INFORMATION_SCHEMA. ТАБЛИЦЫ?
3. я пытаюсь запустить сценарий проверки, который проверял все столбцы в таблице. Теперь у меня есть несколько таблиц в базе данных. Вместо того, чтобы передавать одно имя таблицы за раз, я хочу, чтобы оно принимало все имена таблиц, чтобы был один запуск и проверка выполнялась по всем таблицам.
4. вы можете проверить недокументированный SP: sp_MSforeachtable. статья об использовании: sqlshack.com /…
5. Не используйте
ISNUMERIC
, это возвращает ложные результаты; например,ISNUMERIC('.')
возвращает1
, но не преобразует, где asISNUMERIC('')
вернет0
, но может быть преобразован. ИспользуйтеTRY_CAST
илиTRY_CONVERT
Ответ №1:
Вы могли бы использовать параметр с табличным значением. Перед вызовом Sp заполните табличный параметр всеми именами таблиц, а затем вызовите sp и передайте параметр точно так же, как вы передали бы параметр int или float.
Вот дополнительная информация: https://learn.microsoft.com/en-us/sql/relational-databases/tables/use-table-valued-parameters-database-engine?view=sql-server-2017
Ответ №2:
DECLARE @ActualTableName AS varchar(max)
SELECT @ActualTableName = COALESCE(@ActualTableName ',', '') TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
SELECT @ActualTableName
Теперь у вас есть все имена таблиц, отправьте это @ActualTableName в вашей хранимой процедуре.
В хранимой процедуре вы можете разделить имена этих таблиц с помощью ‘,’.