2010-11-14 70 views
0

剛纔說的是,我正在使用現有的模式(這不完全是最好的),我無法控制它。我必須用它 - 我無法改變它。我需要遊標嗎?

有一個公司表格,每個公司都有記錄,那麼每個公司都有自己的一組表格來代表業務操作。首先,我對每家公司的特定表格感興趣。我的任務是從所有公司的‘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 
) 

的「MyTable的」名稱「公司C公司」將是[C公司INC_ $ MyTable的]

我想在做T-SQL的存儲過程,然後消耗從將顯示數據的C#代碼。

我有限的SQL技能,我猜我需要使用遊標。由於我沒有用光標做太多工作,我希望這裏有人能夠給我一個良好的開端。

感謝,
--ed

回答

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中測試了上面的代碼。

順便說一句誰在每次添加新公司時創建新的公司名稱表?

+0

+1,單選語句,路要走! – 2010-11-15 16:39:04

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) 
+1

我會**從來沒有**使用遊標只是連接字符串! – 2010-11-15 16:43:08