ile SQLCLR saklı yordamlarında oldukça yeniyim. Benim örneğimde, biri parametre olmayan ve bir giriş parametresi olan iki saklı yordamım var. Her ikisi de aynı tabloları hedefler.SQLCLR saklı yordamları giriş parametresi
Parametresiz olanı iyi çalışıyor ve sonuçtaki tüm satırları döndürür. Ancak aynı tabloları hedefleyen bir giriş parametresi olan herhangi bir hata almama rağmen herhangi bir satır döndürmüyor. .NET kodundaki giriş parametresi SqlString
olarak ayarlanmış ve veritabanında NVARCHAR(50)
.
Bu benim C# kodu gibi görünür:
using System;
using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;
public partial class StoredProcedures
{
[Microsoft.SqlServer.Server.SqlProcedure]
public static void AirlineSqlStoredProcedure (SqlString strAirline)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Context Connection=true";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
conn.Open();
cmd.CommandText = "SELECT dbo.tblAirline.AirlineName, dbo.tblAircraft.AircraftUnits, dbo.tblAircraft.Manufacturer, dbo.tblAircraft.AircraftModel FROM dbo.tblAircraft INNER JOIN dbo.tblAirline ON dbo.tblAircraft.AirlineID = dbo.tblAirline.AirlineID WHERE AirlineName = '@strAirline' ORDER BY dbo.tblAircraft.AircraftUnits DESC";
SqlParameter paramAge = new SqlParameter();
paramAge.Value = strAirline;
paramAge.Direction = ParameterDirection.Input;
paramAge.SqlDbType = SqlDbType.NVarChar;
paramAge.ParameterName = "@strAirline";
cmd.Parameters.Add(paramAge);
SqlDataReader sqldr = cmd.ExecuteReader();
SqlContext.Pipe.Send(sqldr);
sqldr.Close();
conn.Close();
}
[Microsoft.SqlServer.Server.SqlProcedure]
public static void AirlineAircraftStoredProcedure()
{
//It returns rows from Roles table
SqlConnection conn = new SqlConnection();
conn.ConnectionString = "Context Connection=true";
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT dbo.tblAirline.AirlineName, dbo.tblAircraft.AircraftUnits, dbo.tblAircraft.Manufacturer, dbo.tblAircraft.AircraftModel FROM dbo.tblAircraft INNER JOIN dbo.tblAirline ON dbo.tblAircraft.AirlineID = dbo.tblAirline.AirlineID ORDER BY dbo.tblAircraft.AircraftUnits DESC";
conn.Open();
SqlDataReader sqldr = cmd.ExecuteReader();
SqlContext.Pipe.Send(sqldr);
sqldr.Close();
conn.Close();
}
}
Ve saklı yordam çalıştırdığınızda ben boş satır olsun:
USE [TravelSight]
GO
DECLARE @return_value Int
EXEC @return_value = [dbo].[AirlineSqlStoredProcedure]
@strAirline = N'American Airlines'
SELECT @return_value as 'Return Value'
GO
(0 row(s) affected)
(1 row(s) affected)
Ayrıca, daha önce bir N
koymak giriş parametresinin dize. Yanlış burada ne
USE [TravelSight]
GO
DECLARE @return_value Int
EXEC @return_value = [dbo].[AirlineAircraftStoredProcedure]
SELECT @return_value as 'Return Value'
GO
(8 row(s) affected)
(1 row(s) affected)
yapmış:
, ben tüm satırları geri alıyorum aynı tabloları hedefleyen saklı yordamAirlineAircraftStoredProcedure
çalıştırırken?
Belki bunlar sadece örneklerdir, fakat olmadıkları takdirde, neden bu CLR saklı yordamları vardır? CLR'nin yerel T-SQL programlarından daha iyi olduğu konusunda hiçbir şey yapmıyor gibi görünmüyor. Öyleyse, hiçbir şeyden faydalanamayacaksın. –
Haklısınız, bu doğru sözdizimini öğrenmek için sadece bir egzersizdi. – user2371684