Tsql 循环遍历数据库中的每个表,并获取一列的前三位数字

Tsql 循环遍历数据库中的每个表,并获取一列的前三位数字,tsql,salesforce,dbamp,Tsql,Salesforce,Dbamp,我正在尝试创建一个表,该表将显示每个表名和ID列的前三个字符(每个表都有此列),然后将数据放入表中。我们使用它来帮助映射Salesforce组织中的依赖关系,该组织使用dbAMP复制到SQL中。我尽可能地修改了下面的代码,并正在寻求帮助以完成它 更新:问题的前半部分已经解决,代码现在运行以给出ID的前三个字符。我仍然可以使用帮助将此代码转换为单个表中的假脱机结果 USE Salesforce GO IF OBJECT_ID('tempdb..#tempResults') IS NOT N

我正在尝试创建一个表,该表将显示每个表名和ID列的前三个字符(每个表都有此列),然后将数据放入表中。我们使用它来帮助映射Salesforce组织中的依赖关系,该组织使用dbAMP复制到SQL中。我尽可能地修改了下面的代码,并正在寻求帮助以完成它

更新:问题的前半部分已经解决,代码现在运行以给出ID的前三个字符。我仍然可以使用帮助将此代码转换为单个表中的假脱机结果

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中所做的相同。我感谢你的帮助!