Перебрать каждую таблицу в базе данных и получить первые три цифры одного столбца - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь создать таблицу, которая будет показывать мне каждое имя таблицы и первые три символа столбца ID (каждая таблица имеет этот столбец), а затем помещать эти данные в таблицу.Мы используем это для сопоставления зависимостей в нашей организации Salesforce, которая реплицируется на SQL с использованием dbAMP.Я адаптировал приведенный ниже код настолько, насколько мог, и ищу помощь, чтобы закончить его.

ОБНОВЛЕНИЕ: первая половина вопроса решена, и теперь код запускается, чтобы дать первые три символа идентификатора.Я все еще мог использовать помощь в преобразовании этого кода, чтобы поместить результаты в одну таблицу.

USE Salesforce
GO




IF OBJECT_ID('tempdb..#tempResults') IS NOT NULL
DROP TABLE #tempResults

CREATE TABLE #tempResults
(
[Object_ID] VARCHAR(3)
--, [org] VARCHAR(100)
, [Table_Name] VARCHAR(100)
)

DECLARE cur CURSOR FOR
SELECT 
    'SELECT DISTINCT LEFT(' + QUOTENAME(c.COLUMN_NAME) + ',3) AS 
[Object_ID], '''
--+ QUOTENAME(TABLE_CATALOG) + ' as [Org], '
+ QUOTENAME(TABLE_NAME) + ''' as [Table_Name] FROM ' 
+ QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.'  + QUOTENAME(TABLE_NAME) 

FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE   
c.[DATA_TYPE] IN ('nchar','varchar', 'nvarchar') 
AND c.[CHARACTER_MAXIMUM_LENGTH] = 18
and c.TABLE_NAME not like '%upload%'
and c.TABLE_NAME not like '%Delta%'
and c.TABLE_NAME not like '%Update%'
and c.TABLE_NAME not like '%Previous%'
and C.COLUMN_NAME = 'ID'


DECLARE @cmd VARCHAR(MAX);
OPEN cur;

FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    --PRINT @cmd
    INSERT INTO #tempResults
    EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END

CLOSE cur;
DEALLOCATE cur;

SELECT * FROM #tempResults

Я не получаю обрезанный идентификатор столбца до первых 3 символов, и он не выводится в таблицу.Я не очень знаком с курсорами, поэтому буду признателен за любую помощь.Спасибо,

1 Ответ

0 голосов
/ 12 февраля 2019

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

Попробуйте обновить свой выбор, чтобы LEFT заключил в скобки QUOTENAME(c.COLUMN_NAME) внутри строки, как показано ниже.Это небольшое изменение заставило ваш скрипт работать с моей установкой salesforce.

SELECT 
    'SELECT DISTINCT LEFT(' + QUOTENAME(c.COLUMN_NAME) + ',3) AS ' 
    + QUOTENAME(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) + ' FROM ' 
    + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' 
    + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE   
    c.[DATA_TYPE] IN ('nchar','varchar', 'nvarchar') 
    AND c.[CHARACTER_MAXIMUM_LENGTH] = 18
    and c.TABLE_NAME not like '%upload%'
    and c.TABLE_NAME not like '%Delta%'
    and c.TABLE_NAME not like '%UPdate%'
    and c.TABLE_NAME not like '%Previous%'
    and C.COLUMN_NAME = 'ID'

Обновление для ответа на вторую часть:

Сначала вам понадобится таблица назначения - I 'Мы использовали временную таблицу, но она будет отлично работать как постоянная таблица.

Я настроил код для вывода двух столбцов вместо одного: IDSubstring (ваша трехсимвольная часть идентификатора) и SourceTable (это точно та же информация, которую вы использовали в качестве имени столбца ранее).Таким образом, мы узнаем, к какой таблице принадлежит часть идентификатора.

Затем внутри курсора, вместо того, чтобы просто выполнить, мы делаем следующее:

INSERT INTO #tempResults
EXEC(@cmd);

Это заполнит нашу таблицу и даст намвыбираемые значения.

CREATE TABLE #tempResults
(
    [IDSubstring] VARCHAR(3)
    , [SourceTable] VARCHAR(50)
)

DECLARE cur CURSOR FOR
SELECT 
    'SELECT DISTINCT LEFT(' + QUOTENAME(c.COLUMN_NAME) + ',3) AS [IDSubstring], '''
    + QUOTENAME(TABLE_CATALOG + '.' + TABLE_SCHEMA + '.' + TABLE_NAME) + ''' as [SourceTable] FROM ' 
    + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.' 
    + QUOTENAME(TABLE_NAME)
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE   
    c.[DATA_TYPE] IN ('nchar','varchar', 'nvarchar') 
    AND c.[CHARACTER_MAXIMUM_LENGTH] = 18
    and c.TABLE_NAME not like '%upload%'
    and c.TABLE_NAME not like '%Delta%'
    and c.TABLE_NAME not like '%UPdate%'
    and c.TABLE_NAME not like '%Previous%'
    and C.COLUMN_NAME = 'ID'


DECLARE @cmd VARCHAR(MAX);
OPEN cur;

FETCH NEXT FROM cur INTO @cmd;
WHILE @@FETCH_STATUS = 0
BEGIN
    --PRINT @cmd
    INSERT INTO #tempResults
    EXEC(@cmd);
FETCH NEXT FROM cur INTO @cmd;
END

CLOSE cur;
DEALLOCATE cur;

SELECT * FROM #tempResults

Обновление 2

Вы правы, предполагая, что это проблема с '''

'' 'это потому, что нам нужно построить нашу строку с одинарными кавычками внутри нее.

В качестве примеров:

SELECT '' ничего не возвращает, в то время как SELECT '''' возвращает '

И SELECT 'This is an example''' вернет Это пример'

Таким образом, ''' являются частью более крупного определения строки, начинающегося с начального 'перед "This", и могут быть разбиты таким образом - первые две одинарные кавычки - это одинарные кавычки, которые мы хотим напечатать внутри строкии третья одинарная кавычка является завершающей строкой кавычкой.Если вы просто запустите оператор select и посмотрите, что он выводит, вы увидите, где каждая одиночная кавычка была вставлена ​​в строку.

Обновлен SELECT ниже.

SELECT 
    'SELECT DISTINCT LEFT(' + QUOTENAME(c.COLUMN_NAME) + ',3) AS [Object_ID], '''
    + QUOTENAME(TABLE_CATALOG) + ''' as [Org], '''
    + QUOTENAME(TABLE_NAME) + ''' as [Table_Name] FROM ' 
    + QUOTENAME(TABLE_CATALOG) + '.' + QUOTENAME(TABLE_SCHEMA) + '.'  + QUOTENAME(TABLE_NAME) 
FROM INFORMATION_SCHEMA.COLUMNS AS c
WHERE   
c.[DATA_TYPE] IN ('nchar','varchar', 'nvarchar') 
AND c.[CHARACTER_MAXIMUM_LENGTH] = 18
and c.TABLE_NAME not like '%upload%'
and c.TABLE_NAME not like '%Delta%'
and c.TABLE_NAME not like '%Update%'
and c.TABLE_NAME not like '%Previous%'
and C.COLUMN_NAME = 'ID'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...