Ciao,
ho un problema nell'esecuzione di uno script .sql da un'applicazione c#.
Io ho questo file kkk.sql che ho generato da Management Studio e che ho modificato.
Questo script ovviamente lanciato da Management Studio funziona correttamente e funziona anche se lo lancio da c# senza utilizzare le transazioni.

Ora vi faccio un esempio

Il file sql è questo:

codice:
USE [MIODB]
GO
/****** Object:  Table [dbo].[Categories]    Script Date: 10/24/2007 11:43:58 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[KKK_Categories](
	[KKK_CATEGORY_ID] [smallint] NOT NULL,
	[Description] [nvarchar](50) COLLATE Latin1_General_CI_AS NULL,
 CONSTRAINT [PK_KKK_Categories] PRIMARY KEY CLUSTERED 
(
	[KKK_CATEGORY_ID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO

insert into dbo.KKK_Categories (KKK_CATEGORY_ID,Description) VALUES (1,'CIAO')
GO
codice:
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'KKK_CATEGORY_ID'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descrizione reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'Description'
il Codice C# per la gestione di questo file è questa

codice:
			
try
			{
				String wholeSql = String.Empty;
				String fname = @"C:\SQLScript\kkk.sql";
				if (File.Exists(fname))
				{
					using (StreamReader sr = new StreamReader(fname))
					{
						wholeSql = sr.ReadToEnd();
					}
				}




				//Eseguo lo split su ogni riga che inizia con GO
				Regex regEx = new Regex("^GO", RegexOptions.Multiline);
				String[] sqlStatements = regEx.Split(wholeSql);
				List<String> ret = new List<String>();

				foreach (String s in sqlStatements)
				{
					if (!(s.StartsWith("USE", StringComparison.OrdinalIgnoreCase) && s.Trim().Length > 0))
					{
						ret.Add(s.Trim());
					}
				}
				using (TransactionScope ts = new TransactionScope(TransactionScopeOption.Required,new TimeSpan(0,5,0)))
				using (SqlConnection conn = new SqlConnection("Data Source=SOURCE;Initial Catalog=MIODB;Persist Security Info=True;User ID=sa;Password=pwd"))
				{
					SqlCommand cmd = new SqlCommand();
					cmd.Connection = conn;

					//loop through each block in the spilt SQL and execute.
					foreach (String sql in ret)
					{
						if (sql.Trim().Length > 0)
						{
							using (TransactionScope ts1 = new TransactionScope(
								TransactionScopeOption.Required, new TimeSpan(0, 5, 0)))
							{
								cmd.CommandText = sql;
								conn.Open();
								cmd.ExecuteNonQuery();
								conn.Close();

								ts1.Complete();
							}
						}
					}
					ts.Complete();
				}
			}
			catch (Exception ex)
			{
				throw ex;
			}
Se eseguo le query senza utilizzare i blocchi TransactionScope tutto funziona.
Invece con il codice che ho postato funzionano tutte le query tranne le ultime 2:

codice:
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'ID reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'KKK_CATEGORY_ID'

GO
EXEC sys.sp_addextendedproperty @name=N'MS_Description', @value=N'Descrizione reparto' ,@level0type=N'SCHEMA', @level0name=N'dbo', @level1type=N'TABLE', @level1name=N'KKK_Categories', @level2type=N'COLUMN', @level2name=N'Description'
Infatti quando eseguo la prima scatta una sqlException con questa descrizione:
"Cannot use SAVE TRANSACTION within a distributed transaction"

Cosa vuole dire?
PErchè le altre query me le esegue e queste due stored procedure no?

Grazie

Michele