我需要创建下面的工作语句的SQL视图(Azure的SQL服务器)。我试图从堆栈溢出许多变化都无济于事。
返回正是我所需要的代码:
SELECT DISTINCT
CAST (valueColumn AS INT)
FROM dbo.valueDB
ORDER BY CAST (valueColumn AS INT)
当这个前缀代码...
CREATE VIEW [distinctValues]
AS
我得到以下错误:
Started executing query at Line 1
Msg 1033, Level 15, State 1, Procedure distinctValues, Line 7
The ORDER BY clause is invalid in views, inline functions, derived tables, subqueries, and common table expressions, unless TOP, OFFSET or FOR XML is also specified.
我试着插入TOP (100) PERCENT
到语句,并不能得到它的工作。我也read this is a "hack" of sorts and shouldn't be used in production。那么,如何得到我想要的视图中创建的声明?
您可以在视图定义中使用的CTE:
CREATE VIEW vwYourView
AS
WITH AllValues
AS (
SELECT DISTINCT
intValue = CAST (valueColumn AS INT)
, intRank = ROW_NUMBER() OVER(PARTITION BY CAST (valueColumn AS INT) ORDER BY CAST (valueColumn AS INT))
FROM dbo.valueDB
)
SELECT TOP(100) PERCENT intValue
FROM AllValues
WHERE intRank = 1
ORDER BY intValue
毫无疑问,最正确的方法是:
SELECT valueColumn FROM vwYourView ORDER BY valueColumn
然而,它发生ETL或者BI工具的具体允许你只能进行选择的表/视图,但不能写SQL和数据的顺序是非常重要的。
至少在目前的解决办法似乎仍然有效获得在这种情况下,一个期望的结果:
CREATE VIEW vwYourView
AS
SELECT DISTINCT TOP (9223372036854775807) CAST (valueColumn AS INT) AS valueColumn
FROM dbo.valueDB
ORDER BY valueColumn
从OP消息中提到的文章:
当然。有总是将是如何得到的SQL Server屈从于你的意志,即使只是暂时的 - 通过使用如此接近100%,这将全面上涨,或使用上限BIGINT类型的百分比: