就在前面说,我正在使用现有架构(这不是最好的架构)而且我无法控制它。我必须使用它 - 我无法改变它。
有一个公司表,每个公司都有一个记录,然后每个公司都有自己的一组表来代表业务运营。首先,我对每家公司的特定表感兴趣。我的任务是从所有公司的“MyTables”生成单个记录集输出
以下是我所拥有的样本:
CREATE TABLE [dbo].[Company](
[timestamp] [timestamp] NOT NULL,
[Name] [varchar](30) NOT NULL,
[Short Code] [varchar](3) NOT NULL,
CONSTRAINT [Company$0] PRIMARY KEY CLUSTERED([Name] ASC))
如果我从公司表中选择所有名称,我会得到(例如)
“A公司”,“B公司”,“C公司”。
然后我为每个公司都有一个表(所有公司特定的表具有完全相同的列定义),具有以下名称(在公司名称中:空格保留,句点更改为下划线):
CREATE TABLE [dbo].[Company A$MyTable](
--Various columns
)
“Company C Inc.”的“MyTable”名称为[Company C Inc_ $ MyTable]
我正在考虑在存储过程中执行T-SQL,然后从将显示数据的C#代码中使用它。
由于我的SQL技能有限,我猜我需要使用游标。由于我没有用游标做很多事情,我希望有人能在这里给我一个良好的开端。
谢谢,
--ed
答案 0 :(得分:3)
这是一种不使用游标的方法。它基于一种方法,该方法将使用“FOR XMLPATH”将值列表转换为字符串
declare @Table4Company table(CoName varchar(30))
declare @sqlCMD varchar(max)
Insert @Table4Company Select distinct (Name) from Company
Select @sqlCMD =
(SELECT
STUFF(
(
SELECT
'UNION Select * from [' + REPLACE(CoName,'.','_') + '$MyTable]'
FROM @Table4Company
FOR XML PATH('')
), 1, 6, ''
)
)
--Select @sqlCMD
您没有说明您支持的SQL版本,并且上述代码在每个版本中都不起作用。我在SQL2K8中测试了上面的代码。
BTW每次添加新公司时,谁创建新的公司名称表?
答案 1 :(得分:2)
尝试这一个,只要您的所有[公司A $ MyTable]的表结构全部相同,这将有效
DECLARE @TableName as nvarchar(max)
DECLARE @StringSQL as nvarchar(max) = ''
DECLARE MY_CURSOR Cursor
FOR
SELECT INFORMATION_SCHEMA.COLUMNS.TABLE_NAME
FROM INFORMATION_SCHEMA.COLUMNS INNER JOIN
Company ON INFORMATION_SCHEMA.COLUMNS.TABLE_NAME = Company.Name
OPEN MY_CURSOR
FETCH NEXT FROM MY_CURSOR
INTO @TableName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @StringSQL = @StringSQL + 'Select ''' + @TableName + ''', * from [' + @TableName + '$MyTable] UNION '
--PRINT @StringSQL
FETCH NEXT FROM MY_CURSOR INTO @TableName
END
CLOSE MY_CURSOR
DEALLOCATE MY_CURSOR
--This removes the last union
SET @StringSQL= LEFT(@StringSQL,LEN(@StringSQL)-6)
EXECUTE (@StringSQL)