2017-05-20 47 views
1

我已经在SQL数据库上成功创建了以下函数。未在正确的SQL数据库中创建SQL函数

CREATE FUNCTION [dbo].[maximum_time] 
(
    @TotalLengthofRecords REAL 
) 
RETURNS FLOAT 
AS 
BEGIN 
    RETURN 
     CASE 
      WHEN @TotalLengthofRecords > 3600 THEN 3600 
      ELSE @TotalLengthofRecords 
     END 
END 

回顾在Microsoft SQL Server Management Studio中的对象,似乎是用户定义的函数已在System Database -> master创建成功。但是,该功能没有出现在项目数据库中。

每当我尝试使用下面的代码来调用该函数:

SELECT 
    A.*, 
    [dbo].[maximum_time]([TotalLengthofRecords_MAX])AS [TotalLengthofRecords_MAX] 
    INTO [dbo].[BunkerAISFinal_V7] 
    FROM [dbo].[BunkerAISFinal_V6] AS A; 

系统会扔了以下错误:

Cannot find either column "dbo" or the user-defined function or aggregate "dbo.maximum_time", or the name is ambiguous.

我该如何解决这个问题?有没有在特定数据库名称中创建函数的方法?

+0

试试看[这里](http://stackoverflow.com/questions/2091830/cannot-find-either-column -dbo或 - 所述用户自定义函数或 - 聚集体 - DBO-S)。同样的问题。可以帮助你。 –

+0

我看过帖子。这是一个不同的问题,因为我相信我的函数应该是一个“标量函数”。 – Cloud

+1

*似乎在系统数据库 - > master *中成功创建了用户定义的功能。这可能是,但它是在数据库所有者(dbo)的帐户下在当时使用的任何数据库中创建的。也许你应该理解'use '的概念,以及'[dbo]'在将它们随机插入到SQL中之前的含义? –

回答

1

根据我收到的意见,问题是由于未定义创建函数的数据库名称导致的。下面代码中的前两行是为了解决问题而添加的。

USE [database_name] 
GO 

CREATE FUNCTION [dbo].[maximum_time] 
(
    @TotalLengthofRecords REAL 
) 
RETURNS FLOAT 
AS 
BEGIN 
    RETURN 
     CASE 
      WHEN @TotalLengthofRecords > 3600 THEN 3600 
      ELSE @TotalLengthofRecords 
     END 
END 
+0

您也可以为当前用户设置默认数据库以避免此错误 – berthos

+0

@berthos无法直接引用master数据库中用户定义的功能。 –

-1
 SELECT 
A.*, 
Master.[dbo].[maximum_time]([TotalLengthofRecords_MAX])AS [TotalLengthofRecords_MAX] 
INTO [dbo].[BunkerAISFinal_V7] 
FROM [dbo].[BunkerAISFinal_V6] AS A; 

1表示一个对象,用户必须遵循这

[服务器/ SERVERIP]。[数据库名]。[SCHEMANAME]。[对象名]。

对于不同的服务器,必须应用链接服务器。

2.如果被引用对象的服务器相同,并且对象位于另一个数据库中并且可以使用不同的模式。

[数据库名]。[SCHEMANAME]。[对象名]

3如果数据库是相同的,不同的模式使用 [SCHEMANAME]。[对象名]

4否则

直接提交对象