2013-08-04 75 views
1

請看到這些T-SQL代碼:功能使用表中返回T-SQL

ALTER PROC [dbo].[SearchAllTables] 
(
    @SearchStr nvarchar(100) 
) 
AS 
BEGIN 

    CREATE TABLE #Results (ColumnName nvarchar(370), ColumnValue nvarchar(3630),DocNo nvarchar(3630)) 
     SET NOCOUNT ON 

    DECLARE @TableName nvarchar(256), @ColumnName nvarchar(128), @SearchStr2 nvarchar(110) 
    SET @TableName = '' 
    SET @SearchStr2 = QUOTENAME('%' + @SearchStr + '%','''') 

    WHILE @TableName IS NOT NULL 
    BEGIN 
     SET @ColumnName = '' 
     SET @TableName = 
     (
      SELECT MIN(QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME)) 
      FROM  INFORMATION_SCHEMA.TABLES 
      WHERE   TABLE_TYPE = 'BASE TABLE' 
       AND QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) > @TableName 
       AND OBJECTPROPERTY(
         OBJECT_ID(
          QUOTENAME(TABLE_SCHEMA) + '.' + QUOTENAME(TABLE_NAME) 
          ), 'IsMSShipped' 
           ) = 0 
     ) 

     WHILE (@TableName IS NOT NULL) AND (@ColumnName IS NOT NULL) 
     BEGIN 

      SET @ColumnName = 
      (
       SELECT MIN(QUOTENAME(COLUMN_NAME)) 
       FROM  INFORMATION_SCHEMA.COLUMNS 
       WHERE   TABLE_SCHEMA = PARSENAME(@TableName, 2) 
        AND TABLE_NAME = PARSENAME(@TableName, 1) 
        AND DATA_TYPE IN ('char', 'varchar', 'nchar', 'nvarchar') 
        AND QUOTENAME(COLUMN_NAME) > @ColumnName 
        AND @TableName IN ('[dbo].[Header]','[dbo].[Padid]','[dbo].[Publisher]','[dbo].[rade]', 
              '[dbo].[Subjects]','[dbo].[Title]','[dbo].[Description1]') 
      ) 

      IF @ColumnName IS NOT NULL 
      BEGIN 
       INSERT INTO #Results 
       EXEC 
       (
        'SELECT ''' + @TableName + '.' + @ColumnName + ''', LEFT(' + @ColumnName + ', 3630) 
        ,'[email protected] + '.DocNo' +' FROM ' + @TableName + ' (NOLOCK) ' + 
' WHERE CONTAINS(' + @ColumnName + ' , ' + @SearchStr2+')' 
       ) 

      END 
     END  
    END 

    SELECT Document.DocNo FROM Document INNER JOIN #Results ON #Results.DocNo=Document.DocNo COLLATE DATABASE_DEFAULT 

END 

這個存儲過程顯示docno。 看這(我把它命名爲代碼一):

DECLARE @DocNo nvarchar(10) 
DECLARE @RadeType nvarchar(20) 
    SELECT @RadeType = DefultSetting.Def_Rade FROM DefultSetting; 

    SELECT Document.DocNo ,Document.DocType,Title.Title,Header.WriterName + ' '+ 
      Header.WriterName AS 'Padid' ,Publisher.PublisherName,Publisher.PublishedDate 
      ,Rade.MainRange + ',' + Rade.Num +','+Rade.KaterNO +','+Rade.Date1 AS 'Rade' 
    FROM Document LEFT OUTER JOIN Title ON Document.DocNo = Title.DocNO 
    LEFT OUTER JOIN Header ON Document.DocNo = Header.DocNo 
    LEFT OUTER JOIN rade ON Document.DocNo = rade.DocNO 
    LEFT OUTER JOIN Publisher ON Document.DocNo = Publisher.DocNo WHERE Rade.Type = @RadeType 
    AND [email protected] 

凡@DocNo是輸出PROC .namely我希望有一些像這樣的事情在PROC的端線:

SELECT GetInfo(Document.DocNo) FROM Document INNER JOIN #Results ON #Results.DocNo=Document.DocNo COLLATE DATABASE_DEFAUL 

,這樣getinfo就像Code-One一樣工作。 我該怎麼做?

+0

您確定不想更改:SELECT * FROM GetInfo(Document.DocNo)Document INNER JOIN #Results ON#Results.DocNo = Document.DocNo COLLATE DATABASE_DEFAULT? – PollusB

回答

0

您可以使用表值函數來返回您想要的表格。 類似於:

create function [dbo].[GetInfo] (@DocNo nvarchar(10), @RadeType nvarchar(20)) 
returns @DocInfo table (
     DocNo  varchar(50) 
    , DocType varchar(50) 
    , Title  varchar(50) 
    , PadId  varchar(50) 
    , PublisherName varchar(50) 
    , PublishedDate datetime 
    , Rade  varchar(100) 
    ) 

as 
begin 
    insert into @DocInfo 
    SELECT Document.DocNo ,Document.DocType,Title.Title,Header.WriterName + ' '+ 
       Header.WriterName AS 'Padid' ,Publisher.PublisherName,Publisher.PublishedDate 
       ,Rade.MainRange + ',' + Rade.Num +','+Rade.KaterNO +','+Rade.Date1 AS 'Rade' 
    FROM Document LEFT OUTER JOIN Title ON Document.DocNo = Title.DocNO 
    LEFT OUTER JOIN Header ON Document.DocNo = Header.DocNo 
    LEFT OUTER JOIN rade ON Document.DocNo = rade.DocNO 
    LEFT OUTER JOIN Publisher ON Document.DocNo = Publisher.DocNo WHERE Rade.Type = @RadeType 
    AND [email protected] 
    return 
end 

您必須修復當然的數據類型。