Tsql 循环遍历数据库中的每个表,并获取一列的前三位数字
我正在尝试创建一个表,该表将显示每个表名和ID列的前三个字符(每个表都有此列),然后将数据放入表中。我们使用它来帮助映射Salesforce组织中的依赖关系,该组织使用dbAMP复制到SQL中。我尽可能地修改了下面的代码,并正在寻求帮助以完成它 更新:问题的前半部分已经解决,代码现在运行以给出ID的前三个字符。我仍然可以使用帮助将此代码转换为单个表中的假脱机结果Tsql 循环遍历数据库中的每个表,并获取一列的前三位数字,tsql,salesforce,dbamp,Tsql,Salesforce,Dbamp,我正在尝试创建一个表,该表将显示每个表名和ID列的前三个字符(每个表都有此列),然后将数据放入表中。我们使用它来帮助映射Salesforce组织中的依赖关系,该组织使用dbAMP复制到SQL中。我尽可能地修改了下面的代码,并正在寻求帮助以完成它 更新:问题的前半部分已经解决,代码现在运行以给出ID的前三个字符。我仍然可以使用帮助将此代码转换为单个表中的假脱机结果 USE Salesforce GO IF OBJECT_ID('tempdb..#tempResults') IS NOT N
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
我没有将列ID修剪为前3个字符,也没有将其输出到表中。我对游标不太熟悉,所以如果有任何帮助,我将不胜感激。谢谢,你真的很接近了。编写select的方式实际上是修剪列名,然后将3个字符的列名附加到字符串中,而不是从ID列中的实际数据中获取前三个字符 尝试更新您的选择,使
左侧
将QUOTENAME(c.COLUMN\u NAME)
括在字符串中,如下所示。这个小改动使您的脚本可以在my 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
您认为这是''
之所以有“”,是因为我们需要在其中使用单引号构建字符串
例如:
选择“”
不返回任何内容
当选择“”时
返回'
然后选择“这是一个示例”将返回“这是一个示例”
因此,“”“
是一个更大的字符串定义的一部分,该定义以“This”之前的首字母“开头”,可以这样分解-前两个单引号是我们要在字符串中打印的单引号,第三个单引号是字符串终止引号。如果只运行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'
杰出的非常感谢。第一部分已经解决,第二部分仍然存在。我现在如何将这些结果“假脱机”到表中?@MikeMarshall,对不起!我更新了答案,也涵盖了第二部分。非常接近。这是我的代码和你的更新。在发布这篇文章之后,我意识到我们还需要一个专栏,但当我添加专栏时,我无法让它正常运行。我相当肯定它是围绕着“”(三个单引号)的位置展开的。我不理解它们的功能。我已经在topSo上发布了我(再次)更新的代码,这个脚本的特殊部分(几乎)与您在VBA中所做的相同。我感谢你的帮助!