Sql server 从sql函数创建sql视图
我有一个函数,它将返回所有公司中的所有项目。表名应该是参数化的。但我无法从该函数创建视图。因为我无法返回表。返回的值是字符串。请帮忙,谢谢Sql server 从sql函数创建sql视图,sql-server,tsql,stored-functions,Sql Server,Tsql,Stored Functions,我有一个函数,它将返回所有公司中的所有项目。表名应该是参数化的。但我无法从该函数创建视图。因为我无法返回表。返回的值是字符串。请帮忙,谢谢 GO IF OBJECT_ID(N'dbo.ufnGetContactInformation', N'TF') IS NOT NULL DROP FUNCTION dbo.ufnGetContactInformation; GO CREATE FUNCTION dbo.ufnGetContactInformation() RETURNS @retCo
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
尝试使用
dynamic
sql
。我没有检查它,但也许这是一种方法
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
请提供更多细节。你想完成什么?在函数中使用游标是非常糟糕的做法。它对性能有非常严重的影响。实际上我有表LG_001_项,LG_002_项。。我想获取该表中的所有值并创建一个视图。数字001002。。。是公司编号,应该是dinamic,我从公司表中读取。谢谢。我改进了语法。现在好多了。非常感谢。我试过了,效果很好。你知道我应该怎么做才能提高性能吗。在函数中,我使用游标,我会在该函数中使用复杂的查询,而且运行速度会很慢。你使用哪种sql server?我使用sql server 2012,但我需要为我们的客户提供,他们使用2005及以上版本