2014-11-24 221 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