2014-11-24 220 views
0

我有一個函數將返回所有公司的所有項目。表名稱應該是parametric.But我不能創建該函數的視圖。因爲我不能返回一個表。返回值是一個字符串。請幫忙。謝謝。從SQL函數創建sql視圖

GO 
IF OBJECT_ID(N'dbo.ufnGetContactInformation', N'TF') IS NOT NULL 
    DROP FUNCTION dbo.ufnGetContactInformation; 
GO 
CREATE FUNCTION dbo.ufnGetContactInformation() 
RETURNS @retContactInformation TABLE 
(
    -- Columns returned by the function 

     firm nvarchar(50) NULL 
) 
AS 
BEGIN 
DECLARE @referans AS INT, @NRP AS INT 

DECLARE @TABLE AS NVARCHAR(MAX) 
SET @TABLE = '' 

DECLARE YourCursorNameHere CURSOR READ_ONLY 
     FOR 
        select c1.NR, C2.NR 
        from L_caPIFIRM c1 WITH(nolock) 
        INNER JOIN L_CAPIPERIOD C2 WITH(nolock) ON C1.NR=C2.FIRMNR 



OPEN YourCursorNameHere 
FETCH NEXT FROM YourCursorNameHere INTO @referans, @NRP 
WHILE @@FETCH_STATUS = 0 
     BEGIN 
        IF @TABLE = '' 
         SET @TABLE= 'SELECT FIRM=' + str(@referans) +', CODE FROM LG_' + SUBSTRING(('00'+ LTRIM(STR(@referans))),LEN(('00'+ LTRIM(STR(@referans))))-2,3)+ '_ITEMS' 
        ELSE 
         SET @TABLE= @TABLE + ' UNION SELECT FIRM=' + str(@referans) +', CODE FROM LG_' + SUBSTRING(('00'+ LTRIM(STR(@referans))),LEN(('00'+ LTRIM(STR(@referans))))-2,3)+ '_ITEMS' 


     FETCH NEXT FROM YourCursorNameHERE INTO @referans,@NRP 
     END 
     -- EXEC(@TABLE) 
CLOSE YourCursorNameHere 
DEALLOCATE YourCursorNameHere 

     --BEGIN 
    -- INSERT INTO select 

    -- END 



    RETURN; 
END; 
GO 
+0

請給更多細節。你想達到什麼目的?在函數中使用遊標是非常糟糕的做法。它有非常嚴重的性能影響。 – Jaques 2014-11-24 09:14:24

+0

其實我有表LG_001_Items,LG_002_Items ..我想獲得該表中的所有值,並創建一個視圖。數字001,002 ...是行號,他們應該是動態我從他們公司table.Thanks讀他們。 – user3310933 2014-11-24 11:27:19

回答

0

嘗試使用dynamicsql。我didnt檢查,但也許這是做它的方式......

RETURNS @retContactInformation varchar(max) -- not table 
. 
. 


    DECLARE @sql nvarchar(max) 
DECLARE @sqlx nvarchar(max)=dbo.ufnGetContactInformation() 

set @sql='CREATE VIEW [aaa] 
AS 
'+ @sqlx+'' 
EXECUTE sp_executesql @SQL 

代替光標嘗試while循環

CREATE TABLE #tempo (id INT IDENTITY (1,1),c1nr varchar(10),c2nr varchar(10)) 
insert into #tempo 
select c1.NR, C2.NR 

        from L_caPIFIRM c1 WITH(nolock) 
        INNER JOIN L_CAPIPERIOD C2 WITH(nolock) ON C1.NR=C2.FIRMNR 
DECLARE @i int = (SELECT count(*) FROM #tempo) 
DECLARE @id int=1 
WHILE @i!=0 
BEGIN 
SELECT @referans=c1nr, 
    @table =IIF ((@TABLE = ''), 

'SELECT FIRM=' + str(@referans) +', CODE FROM LG_' + SUBSTRING(('00'+ LTRIM(STR(@referans))),LEN(('00'+ LTRIM(STR(@referans))))-2,3)+ '_ITEMS', 

@TABLE + ' UNION SELECT FIRM=' + str(@referans) +', CODE FROM LG_' + SUBSTRING(('00'+ LTRIM(STR(@referans))),LEN(('00'+ LTRIM(STR(@referans))))-2,3)+ '_ITEMS') 
from #tmpo 
where [email protected] 
set @[email protected]+1 
set @[email protected] 
END 
+0

我改進了語法。現在好多了。 – 2014-11-24 10:03:42

+0

好吧,我檢查一下,它的工作原理 - ;) – 2014-11-24 10:52:16

+0

非常感謝。我試過了,它的工作原理。你也不知道我應該怎麼做的性能。在函數我使用光標,我會用複雜的查詢在這個功能中,它會運行緩慢。 – user3310933 2014-11-24 11:59:46