Ты действительно близко.То, как вы написали свой выбор, фактически обрезает имя столбца, а затем добавляет это трехзначное имя столбца в строку, а не получает первые три символа из фактических данных в столбце идентификатора.
Попробуйте обновить свой выбор, чтобы 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'