Sql server sql脚本需要if语句包装

Sql server sql脚本需要if语句包装,sql-server,tsql,Sql Server,Tsql,我试图将一个简单的函数包装在一个存在性检查中,为什么我会得到错误的语法 更新: GO IF EXISTS (SELECT TOP 1 * FROM Customers) BEGIN USE [rstestDB] SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON CREATE FUNCTION [dbo].[udf_GetName] ( @p

我试图将一个简单的函数包装在一个存在性检查中,为什么我会得到错误的语法

更新:

GO

IF EXISTS (SELECT TOP 1 * FROM Customers)
    BEGIN
        USE [rstestDB]

        SET ANSI_NULLS ON

        SET QUOTED_IDENTIFIER ON

        CREATE FUNCTION [dbo].[udf_GetName] 
        (
            @p1 nvarchar(25)
        )
        RETURNS varchar
        AS
        BEGIN
            DECLARE @Result varchar(25)
            SELECT @Result = 'John Doe'
            RETURN @Result
        END
    END
GO
获取以下错误: Msg 156,第15级,状态1,第10行 关键字“FUNCTION”附近的语法不正确。 味精178,第15级,状态1,第19行 具有返回值的RETURN语句不能在此上下文中使用。

GO是sqlcmd和osql实用程序识别的命令,用于向SQL引擎发送命令,它不是有效的SQL

取出所有的
GO
s,除了最末端

一个同样会失败的简单示例:

IF 1=1
BEGIN
 SELECT 'FOO'
 GO
END
您的所有设置实际上都应该在脚本的最开始,因为它们将在整个会话期间保持不变。

GO是sqlcmd和osql实用程序识别的命令,用于向SQL引擎发送命令,它不是有效的SQL

取出所有的
GO
s,除了最末端

一个同样会失败的简单示例:

IF 1=1
BEGIN
 SELECT 'FOO'
 GO
END

您的所有设置实际上都应该在脚本的最开始,因为它们将在整个会话期间保持不变。

您正在尝试将
'John Doe'
设置为
INT
谢谢,已更新。但它仍然存在一个问题。这和围棋有关吗?如果删除If检查,则开始和结束脚本工作正常。直到我介绍了这张支票exists@rod是的,请看我下面的答案。varchar和nvarchar应该总是有长度参数,例如varchar(30)。否则,它们可能在某些上下文中默认为varchar(1),在其他上下文中默认为varchar(30)。@JohnDewey:它们的默认长度为1-除了在
CAST
CONVERT
中,它们的默认长度为30。您正在尝试将
'John Doe'
设置为
INT
谢谢,已更新。但它仍然存在一个问题。这和围棋有关吗?如果删除If检查,则开始和结束脚本工作正常。直到我介绍了这张支票exists@rod是的,请看我下面的答案。varchar和nvarchar应该总是有长度参数,例如varchar(30)。否则,它们可能在某些上下文中默认为varchar(1),在其他上下文中默认为varchar(30)。@JohnDewey:它们的默认长度为1-除了在
CAST
CONVERT
中,它们的默认长度为30