Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
具有动态列计数的SQL视图_Sql_Sql Server_Sql View_Sql Function - Fatal编程技术网

具有动态列计数的SQL视图

具有动态列计数的SQL视图,sql,sql-server,sql-view,sql-function,Sql,Sql Server,Sql View,Sql Function,我知道直接创建视图是不可能的,但也许借助sql函数可以创建具有动态列计数的视图?我要做的就是创建视图,其中的列是username(第一个表的值)、date(第二个表的值)和多个属性列(第三个表的每一行都是column)。User table structure-ID和username、date table structure-ID和datetime、Property table structure-ID、Property name、Property value、,fk用户ID(加上一个表以关联表

我知道直接创建视图是不可能的,但也许借助sql函数可以创建具有动态列计数的视图?我要做的就是创建视图,其中的列是username(第一个表的值)、date(第二个表的值)和多个属性列(第三个表的每一行都是column)。User table structure-ID和username、date table structure-ID和datetime、Property table structure-ID、Property name、Property value、,fk用户ID(加上一个表以关联表)。 结果应该如下所示(列):

|用户名|日期|属性1 |......属性n|


任何人都可以显示任何简单的示例吗?

这在标准SQL或我熟悉的任何SQL版本(SQL Server、Oracle、MySql、Access SQL)中都是不可能的。根据设计,SQL中的表、表达式和视图具有固定的列集。也就是说,它是故意这样限制的。好的,在大多数SQL版本中,存储过程是唯一可以返回变量列集的对象。

我对您的数据模式做了一些假设,但看起来您正试图生成类似的内容

CREATE VIEW User_Properties AS
SELECT 
[username], [date]
,MAX(CASE WHEN [PropertyName] = 'property 1' THEN [PropertyValue]  ELSE NULL END) AS [property 1]
,MAX(CASE WHEN [PropertyName] = 'property 2' THEN [PropertyValue]  ELSE NULL END) AS [property 2]
,MAX(CASE WHEN [PropertyName] = 'property 3' THEN [PropertyValue]  ELSE NULL END) AS [property 3]
....
,MAX(CASE WHEN [PropertyName] = 'property n' THEN [PropertyValue]  ELSE NULL END) AS [property n]
GROUP BY [username], [date]
可以按照以下方式实现自动化:

--Cursor to return the list of Properties
DECLARE PROPERTY_CURSOR CURSOR FOR SELECT PropertyName From UserPropertyTable

DECLARE @PropertyName nvarchar(255)
DECLARE @SQL nvarchar(max)

--Start Building the view definition
SET @SQL ='CREATE VIEW User_Properties AS
SELECT [username], [date]'

--Add a column for each Property
OPEN PROPERTY_CURSOR 
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
WHILE @@FETCH_STATUS =0
BEGIN
SET @SQL = ',MAX(CASE WHEN [PropertyName] = '+QUOTENAME(@PropertyName,'''')+' THEN [PropertyValue]  ELSE NULL END) AS '+QUOTENAME(@PropertyName)
FETCH NEXT FROM PROPERTY_CURSOR INTO @PropertyName
END
DEALLOCATE PROPERTY_CURSOR 


--Finish off the Create_View SQL 
SET @SQL =@SQL +'
FROM UserPropertyTable
GROUP BY [username], [date]'

--Execute the Create_View SQL 
EXEC (@SQL)

当然这是可能的,到目前为止,您得到了什么?您可以创建一个包含任意列数的视图。但是,一旦您创建了视图,在重新创建视图之前,列集将保持不变,因为RDBMS的关系性质是不可能的。@Coffee AFAIK,这是不可能的