Есть ли способ передать все имена таблиц в базе данных в качестве параметра для SP?

#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 , но не преобразует, где as ISNUMERIC('') вернет 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 в вашей хранимой процедуре.
В хранимой процедуре вы можете разделить имена этих таблиц с помощью ‘,’.

разделенная строка в sql