从 sql 函数创建 sql 视图

Posted

技术标签:

【中文标题】从 sql 函数创建 sql 视图【英文标题】:create sql view from a sql function 【发布时间】:2014-11-24 08:57:39 【问题描述】:

我有一个函数,它将返回所有公司中的所有项目。表名称应该是参数化的。但是我无法从该函数创建视图。因为我无法返回表。返回的值是一个字符串。请帮忙。谢谢。

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

【问题讨论】:

请提供更多细节。你想达到什么目的?在函数中使用游标是非常糟糕的做法。它对性能有非常严重的影响。 实际上我有表 LG_001_Items,LG_002_Items.. 我想获取该表中的所有值并创建一个视图。数字 001,002... 是公司编号,它们应该是动态的,我从中读取它们公司表。谢谢。 【参考方案1】:

尝试使用dynamicsql。我没有检查它,但也许这是这样做的方法......

 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 id=@id
set @id=@id+1
set @i=@i-1
END

【讨论】:

我改进了语法。现在好多了。 非常感谢。我试过了,它可以工作。另外你知道我应该怎么做才能提高性能。在我使用光标的函数中,我将在该函数中使用复杂的查询,它会慢慢来。 你用的是哪个sql server? 我使用 sql server 2012,但我们的客户需要它,他们使用 2005 及以上版本

以上是关于从 sql 函数创建 sql 视图的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2008数据库中怎么创建视图

常用的sql函数

sql server表值函数和视图如何一起使用

从 SQL 视图创建 laravel 模型

mysql 视图

SQL:如何从递归查询创建视图?