Member 11776570 Ответов: 2

Это дает ошибку для GO


Я сделал эту функцию, но она дает ошибку

IF  EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[SuccessEHS].[GetDispense]') AND type in (N'FN', N'IF', N'TF', N'FS', N'FT'))
DROP FUNCTION [SuccessEHS].[GetDispense]
GO

Create function [SuccessEHS].[GetDispense] 
(
    @text nvarchar(40)
) 
returns varchar(40)
as begin
    -- emulate vba's val() function
    declare @result varchar(40)
 
    declare @tmp varchar(40)
    set @tmp = @text
    while isnumeric(@tmp) = 0 and len(@tmp)>0 begin
        set @tmp=left(@tmp,len(@tmp)-1)
    end
    set @result = @tmp
    return @result
end
GO


Что я уже пробовал:

Я написал правильный синтаксис. Но я не могу найти решение.

OriginalGriff

Какую ошибку вы получаете?

Santosh kumar Pithani

Здравствуйте,Ваше условие IF declare неверно, то есть вместо "Else" вы дали "GO", так как же это работает?покажите мне ваше сообщение об ошибке

2 Ответов

Рейтинг:
9

RickZeeland

Ниже приведена процедура выполнения SQL команд из встроенного скрипта SSMS ресурса с помощью команд GO:

public static void CreateDatabase(string server, string catalog, string username, string password)
{
	// get the stream
	Stream stream = System.Reflection.Assembly.GetExecutingAssembly().GetManifestResourceStream("MyNamespace.DatabaseUnicode.sql");

	if (stream != null)
	{
		var sr = new StreamReader(stream);
		var script = sr.ReadToEnd();
		sr.Close();
		stream.Close();

		var connectionString = GetConnectionString(server, string.Empty, username, password);
		using (var connection = new SqlConnection(connectionString))
		{
			connection.Open();
			
			if (connection.State == System.Data.ConnectionState.Open)
			{
				// replace it with the correct catalog name
				script = script.Replace("##ArchiveName##", catalog);

				IDbCommand command = connection.CreateCommand();
				command.CommandType = CommandType.Text;

				script = script.Replace("'", "''");
				script = script.Replace("\r\nGO\r\n", "\x07");      // "GO" is not a Transact SQL command, but utilities command
				script = script.Replace("\r\ngo\r\n", "\x07");
				script = script.Replace("\r\nGo\r\n", "\x07");
				script = script.Replace("\r\ngO\r\n", "\x07");

				string[] arrBatches = script.Split('\x07');

				for (int i = 0; i < arrBatches.Length; ++i)
				{
					string scriptBatch = arrBatches[i];
					if (scriptBatch == string.Empty)
					{
						continue;
					}

					string sqlScript = string.Format("sp_executesql N'{0}'", scriptBatch);
					command.CommandText = sqlScript;
					command.CommandTimeout = SqlCommandTimeout;
					command.ExecuteNonQuery();
				}
			}
		}

		SqlConnection.ClearAllPools();
	}
	else
	{
		throw new Exception("The resource sql script could not be found");
	}
}


Richard Deeming

Просто подождите - кто-нибудь добавит GO 5 к одному из ваших файлов скриптов и сломать ваш код. - Но это работает в SSMS..." :)

RickZeeland

Интересно, использует ли кто-нибудь это, я никогда не видел его в использовании, но мои знания SQL Server становятся ржавыми, когда мы перешли на PostgreSQL много лет назад.
В любом случае, спасибо, что напомнили нам об этом варианте :)

Рейтинг:
15

RickZeeland

То ГО оператор работает только в среде SQL Server Management Studio, Если вы используете его из кода, вам не нужно использовать GO.
Этот синтаксис также можно использовать в SQL Server 2016 и выше:

DROP FUNCTION IF EXISTS [SuccessEHS].[GetDispense]


Member 11776570

Хорошо, но я использую это в Visual Studio в файле .sql.

RickZeeland

Оператор GO работает только в среде SQL Server Management Studio, поэтому вам придется удалить эти строки !
Если вы хотите оставаться "совместимым", вы также можете удалить эти строки на лету в своем коде.