Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Büyük nesne (LOB) veri türleri, en fazla 8 kilobayt (KB) satır boyutunu aşanlardır. SQL Server, 2^32 bayt kadar büyük değerlerin depolanmasına izin vermek için , maxve varchar veri türleri için nvarcharbir varbinary tanımlayıcı sağlar. Tablo sütunları ve Transact-SQL değişkenleri , varchar(max)veya nvarchar(max) veri türlerini belirtebilirvarbinary(max). .NET'te max veri türleri bir DataReader tarafından getirilebilir ve özel bir DataReader işleme gerek olmadan hem girdiler hem de çıktılar için parametre değerleri olarak belirtilebilir. Büyük varchar veri türleri için veriler artımlı olarak alınabilir ve güncelleştirilebilir.
Veri max türleri karşılaştırmalar, Transact-SQL değişkenleri ve birleştirme için kullanılabilir. Bunlar select deyiminin DISTINCT, ORDER BY, GROUP BY yan tümcelerinde ve toplamalarda, birleştirmelerde ve alt sorgularda da kullanılabilir.
Büyük değerli veri türleri hakkında daha fazla bilgi için bkz. SQL Server Books Online'dan Large-Value Veri Türlerini Kullanma .
Büyük değer türü kısıtlamaları
Aşağıdaki kısıtlamalar, daha küçük veri türleri için mevcut olmayan veri türleri için geçerlidir max :
A
sql_variant, büyükvarcharbir veri türü içeremez.Büyük
varcharsütunlar bir dizinde anahtar sütun olarak belirtilemez. Kümelenmemiş bir dizine dahil edilen bir sütunda bunlara izin verilmektedir.Büyük
varcharsütunlar bölümleme anahtarı sütunları olarak kullanılamaz.
Transact-SQL'da büyük değerli türlerle çalışma
Transact-SQL OPENROWSET işlevi, uzak verilere bağlanmak ve verilere erişmek için tek seferlik bir yöntemdir.
OPENROWSET bir sorgunun FROM yan tümcesinde tablo adıymış gibi başvurulabilir. Insert, UPDATE veya DELETE deyiminin hedef tablosu olarak da başvurulabilir.
OPENROWSET işlevi, verileri hedef tabloya BULK yüklemeden doğrudan bir dosyadan okumanızı sağlayan satır kümesi sağlayıcısını içerir. Bu, basit bir INSERT SELECT deyiminde kullanmanızı OPENROWSET sağlar.
Seçenek OPENROWSET BULK bağımsız değişkenleri, okuma verilerinin nereden başlayacağı ve biteceği, hatalarla nasıl başa çıkıldığı ve verilerin nasıl yorumlandığı üzerinde önemli bir denetim sağlar. Örneğin, veri dosyasının , varbinaryveya varchartüründe nvarchartek satırlı, tek sütunlu satır kümesi olarak okunmasını belirtebilirsiniz. Söz diziminin ve seçeneklerin tamamı için bkz. SQL Server Books Online.
Aşağıdaki örnek, örnek veritabanındaki ProductPhoto tablosuna AdventureWorks2025 bir fotoğraf ekler. Sağlayıcıyı kullanırken, her sütuna BULK OPENROWSET değer eklemeseniz bile adlandırılmış sütun listesini sağlamanız gerekir. Bu durumda birincil anahtar bir kimlik sütunu olarak tanımlanır ve sütun listesinden atlanabilir. Deyimin sonunda da bir bağıntı OPENROWSET adı sağlamanız gerektiğini unutmayın. Bu örnekte ThumbnailPhoto değeridir. Bu, dosyanın yüklendiği tablodaki ProductPhoto sütunla bağıntılı olur.
INSERT Production.ProductPhoto (
ThumbnailPhoto,
ThumbnailPhotoFilePath,
LargePhoto,
LargePhotoFilePath)
SELECT ThumbnailPhoto.*, null, null, N'tricycle_pink.gif'
FROM OPENROWSET
(BULK 'c:\images\tricycle.jpg', SINGLE_BLOB) ThumbnailPhoto
UPDATE .WRITE komutu kullanarak verileri güncelleştirme.
Transact-SQL UPDATE deyimi, varchar(max), nvarchar(max) veya varbinary(max) sütunlarının içeriğini değiştirmek için yeni WRITE söz dizimini kullanır. Bu, verilerin kısmi güncelleştirmelerini gerçekleştirmenizi sağlar. UPDATE .WRITE söz dizimi burada kısaltılmış olarak verilmiştir.
Güncelleme
{ <object> }
SET
{ column_name = { .WRITE ( ifade , @Offset , @Length ) }
WRITE yöntemi, column_name değerinin bir bölümünün değiştirileceğini belirtir. İfade , column_name kopyalanacak değerdir, @Offset ifadenin yazılacağı başlangıç noktasıdır ve @Length bağımsız değişken sütundaki bölümün uzunluğudur.
| If | Ardından |
|---|---|
| İfade NULL olarak ayarlandı |
@Length yoksayılır ve column_name değeri belirtilen @Offset sınırında kesilir. |
@Offset NULL'dur |
Güncelleştirme işlemi, ifadeyi mevcut column_name değerinin sonuna ekler ve @Length yoksayılır. |
@Offset column_name değerinin uzunluğundan büyük |
SQL Server bir hata döndürür. |
@Length NULL'dur |
Güncelleştirme işlemi, değerin @Offset sonuna column_name kadar olan tüm verileri kaldırır. |
Uyarı
@Offset da @Length da negatif sayı olamaz.
Example
Bu Transact-SQL örnek, AdventureWorks veritabanındaki Document tablosundaki bir sütun olan DocumentSummary'deki kısmi değeri nvarchar(max) güncelleştirir. 'components' sözcüğü yerine geçen sözcük, var olan verilerde değiştirilecek sözcüğün başlangıç konumu (uzaklık) ve değiştirilecek karakter sayısı (uzunluk) belirtilerek 'özellikler' sözcüğüyle değiştirilir. Örnek, sonuçları karşılaştırmak için UPDATE deyiminden önceki ve sonraki SELECT deyimlerini içerir.
USE AdventureWorks2022;
GO
--View the existing value.
SELECT DocumentSummary
FROM Production.Document
WHERE DocumentID = 3;
GO
-- The first sentence of the results will be:
-- Reflectors are vital safety components of your bicycle.
--Modify a single word in the DocumentSummary column
UPDATE Production.Document
SET DocumentSummary .WRITE (N'features',28,10)
WHERE DocumentID = 3 ;
GO
--View the modified value.
SELECT DocumentSummary
FROM Production.Document
WHERE DocumentID = 3;
GO
-- The first sentence of the results will be:
-- Reflectors are vital safety features of your bicycle.
ADO.NET'da büyük değer türleriyle çalışma
ADO.NET'te büyük değer türleriyle çalışabilirsiniz; bir sonuç kümesi döndürmek için SqlParameter içindeki nesneler olarak büyük değer türlerini belirterek veya bir SqlDataReader kullanarak SqlDataAdapterDataSet/DataTable doldurabilirsiniz. Büyük bir değer türüyle çalışma şekliniz ile ilgili, daha küçük değer veri türü arasında bir fark yoktur.
Veri Almak için GetSqlBytes Kullanma
GetSqlBytes yöntemi SqlDataReader bir varbinary(max) sütunun içeriğini almak için kullanılabilir. Aşağıdaki kod parçası, bir tablodan varbinary(max) verisi seçen SqlCommand adlı cmd nesnesi ve bu verileri SqlBytes olarak alan SqlDataReader adlı reader nesnesinin olduğunu varsayar.
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
SqlBytes bytes = reader.GetSqlBytes(0);
}
Veri almak için GetSqlChars kullanma
GetSqlChars yöntemi SqlDataReader bir varchar(max) veya nvarchar(max) sütununun içeriğini almak için kullanılabilir. Aşağıdaki kod parçası, bir tablodan veri seçen SqlCommand adlı cmd bir nvarchar(max) nesnenin ve verileri alan adlı SqlDataReader bir reader nesnenin olduğunu varsayar.
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
SqlChars buffer = reader.GetSqlChars(0);
}
Veri almak için GetSqlBinary kullanma
GetSqlBinary yöntemi, bir SqlDataReader nesnenin varbinary(max) sütun içeriğini almak için kullanılabilir. Aşağıdaki kod parçası, bir tablodan varbinary(max) verilerini seçen SqlCommand adlı bir cmd nesnesinin ve verileri bir SqlBinary akış olarak alan SqlDataReader adlı bir reader nesnesinin olduğunu varsayar.
reader = cmd.ExecuteReader(CommandBehavior.CloseConnection);
while (reader.Read())
{
SqlBinary binaryStream = reader.GetSqlBinary(0);
}
Veri almak için GetBytes kullanma
GetBytes yöntemini kullanan SqlDataReader, belirtilen sütun uzaklığından başlayan bayt akışını, belirtilen dizi uzaklığından itibaren bayt dizisine okur. Aşağıdaki kod parçası, baytları bir bayt dizisine alan SqlDataReader adlı reader nesnesinin olduğunu varsayar. Dikkat edin ki, GetSqlBytes'dan farklı olarak GetBytes, dizi arabelleği için bir boyut gerektirir.
while (reader.Read())
{
byte[] buffer = new byte[4000];
long byteCount = reader.GetBytes(1, 0, buffer, 0, 4000);
}
Veri almak için GetValue kullanma
Bir GetValue yöntemi, SqlDataReader belirtilen sütun uzaklığından değeri okur ve bir diziye aktarır. Aşağıdaki kod parçası, SqlDataReader adlı bir reader nesnesinin ilk sütun ofsetinden ikili veriyi ve ardından ikinci sütun ofsetinden dize verisini aldığını varsayar.
while (reader.Read())
{
// Read the data from varbinary(max) column
byte[] binaryData = (byte[])reader.GetValue(0);
// Read the data from varchar(max) or nvarchar(max) column
String stringData = (String)reader.GetValue(1);
}
Büyük değer türlerinden CLR türlerine dönüştürme
varchar(max) veya nvarchar(max) sütununun içeriğini, ToString gibi dize dönüştürme yöntemlerinden herhangi birini kullanarak dönüştürebilirsiniz. Aşağıdaki kod parçası, verileri alan SqlDataReader adlı bir reader nesnesi olduğunu varsayar.
while (reader.Read())
{
string str = reader[0].ToString();
Console.WriteLine(str);
}
Example
Aşağıdaki kod, veritabanındaki tablodan LargePhotoProductPhoto adı ve nesneyi AdventureWorks alır ve bir dosyaya kaydeder. Derlemenin System.Drawing ad alanına bir başvuru ile derlenmesi gerekir.
GetSqlBytes metodunun, bir SqlBytes nesnesi ve bu nesne üzerinde bir Stream özelliği kullanan SqlDataReader döndürdüğü. Kod, yeni Bitmap bir nesne oluşturmak için bunu kullanır ve gif'e ImageFormatkaydeder.
using Microsoft.Data.SqlClient;
using System.Data.SqlTypes;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
class Program
{
static void Main()
{
// Supply any valid DocumentID value and file path.
// The value 3 is supplied for DocumentID, and a literal
// string for the file path where the image will be saved. 1, 60
TestGetSqlBytes(7, @"c:\temp\");
Console.ReadLine();
}
static private void TestGetSqlBytes(int documentID, string filePath)
{
// Assumes GetConnectionString returns a valid connection string.
using (SqlConnection connection =
new SqlConnection(GetConnectionString()))
{
SqlCommand command = connection.CreateCommand();
SqlDataReader reader = null;
try
{
// Setup the command
command.CommandText =
"SELECT LargePhotoFileName, LargePhoto "
+ "FROM Production.ProductPhoto "
+ "WHERE ProductPhotoID=@ProductPhotoID";
command.CommandType = CommandType.Text;
// Declare the parameter
SqlParameter paramID =
new SqlParameter("@ProductPhotoID", SqlDbType.Int);
paramID.Value = documentID;
command.Parameters.Add(paramID);
connection.Open();
string photoName = null;
reader = command.ExecuteReader(CommandBehavior.CloseConnection);
if (reader.HasRows)
{
while (reader.Read())
{
// Get the name of the file.
photoName = reader.GetString(0);
// Ensure that the column isn't null
if (reader.IsDBNull(1))
{
Console.WriteLine("{0} is unavailable.", photoName);
}
else
{
SqlBytes bytes = reader.GetSqlBytes(1);
using (Bitmap productImage = new Bitmap(bytes.Stream))
{
String fileName = filePath + photoName;
// Save in gif format.
productImage.Save(fileName, ImageFormat.Gif);
Console.WriteLine("Successfully created {0}.", fileName);
}
}
}
}
else
{
Console.WriteLine("No records returned.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
finally
{
if (reader != null)
reader.Dispose();
}
}
}
static private string GetConnectionString()
{
// To avoid storing the connectionection string in your code,
// you can retrieve it from a configuration file, using the
// System.Configuration.ConfigurationSettings.AppSettings property
return "Data Source=(local);Initial Catalog=AdventureWorks;" +
"Integrated Security=SSPI";
}
}
Büyük değer türü parametrelerini kullanma
Büyük değer türleri, SqlParameter nesnelerinde, SqlParameter nesnelerinde daha küçük değer türlerini kullandığınız gibi kullanılabilir. Aşağıdaki örnekte gösterildiği gibi büyük değer türlerini SqlParameter olarak alabilirsiniz. Kod, örnek veritabanında aşağıdaki GetDocumentSummary saklı yordamının AdventureWorks2025 mevcut olduğunu varsayar. Saklı yordam adlı @DocumentID bir giriş parametresi alır ve çıkış parametresindeki DocumentSummary sütununun @DocumentSummary içeriğini döndürür.
CREATE PROCEDURE GetDocumentSummary
(
@DocumentID int,
@DocumentSummary nvarchar(MAX) OUTPUT
)
AS
SET NOCOUNT ON
SELECT @DocumentSummary=Convert(nvarchar(MAX), DocumentSummary)
FROM Production.Document
WHERE DocumentID=@DocumentID
Example
ADO.NET kodu, GetDocumentSummary saklı yordamını yürütmek ve büyük bir değer türü olarak depolanan belge özetini almak amacıyla SqlConnection ve SqlCommand nesnelerini oluşturur. Kod giriş parametresi için @DocumentID bir değer geçirir ve konsol penceresinde çıkış parametresinde @DocumentSummary geri geçirilen sonuçları görüntüler.
using Microsoft.Data.SqlClient;
class Program
{
static void Main()
{
// Supply any valid Document ID value.
// The value 7 is supplied for demonstration purposes.
string summaryString = GetDocumentSummary(7);
Console.ReadLine();
}
static private string GetDocumentSummary(int documentID)
{
//Assumes GetConnectionString returns a valid connection string.
using (SqlConnection connection =
new SqlConnection(GetConnectionString()))
{
connection.Open();
SqlCommand command = connection.CreateCommand();
try
{
// Setup the command to execute the stored procedure.
command.CommandText = "GetDocumentSummary";
command.CommandType = CommandType.StoredProcedure;
// Set up the input parameter for the DocumentID.
SqlParameter paramID =
new SqlParameter("@DocumentID", SqlDbType.Int);
paramID.Value = documentID;
command.Parameters.Add(paramID);
// Set up the output parameter to retrieve the summary.
SqlParameter paramSummary =
new SqlParameter("@DocumentSummary",
SqlDbType.NVarChar, -1);
paramSummary.Direction = ParameterDirection.Output;
command.Parameters.Add(paramSummary);
// Execute the stored procedure.
command.ExecuteNonQuery();
Console.WriteLine((String)(paramSummary.Value));
return (String)(paramSummary.Value);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
return null;
}
}
}
static private string GetConnectionString()
{
// To avoid storing the connectionection string in your code,
// you can retrieve it from a configuration file, using the
// System.Configuration.ConfigurationSettings.AppSettings property
return "Data Source=(local);Initial Catalog=AdventureWorks;" +
"Integrated Security=SSPI";
}
}