你真的很亲近。您编写选择的方式实际上是修剪列名,然后将该 3 个字符的列名附加到字符串,而不是从 ID 列中的实际数据中获取前三个字符。
尝试更新您的选择,使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'
更新回答第二部分:
首先,您需要一个目标表 - 我使用了一个临时表,但这可以作为永久表正常工作。
我已将代码调整为输出两列而不是一列:IDSubstring(您的 3 字符 ID 部分)和 SourceTable(这与您之前用作列名的信息完全相同)。这样我们就知道 ID 部分属于哪个表。
然后,在光标内部,我们不只是执行,而是这样做:
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'