我需要游标吗?

时间:2010-11-14 18:46:13

标签: sql-server tsql cursor

就在前面说,我正在使用现有架构(这不是最好的架构)而且我无法控制它。我必须使用它 - 我无法改变它。

有一个公司表,每个公司都有一个记录,然后每个公司都有自己的一组表来代表业务运营。首先,我对每家公司的特定表感兴趣。我的任务是从所有公司的“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

2 个答案:

答案 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)