SQLCLRストアドプロシージャの新機能です。私の例では、2つのストアドプロシージャがあり、1つはパラメータなしで、もう1つは入力パラメータ付きです。どちらも同じテーブルを対象としています。入力パラメータを持つSQLCLRストアドプロシージャ
パラメータのないものは正常に動作し、結果のすべての行を返します。しかし、同じテーブルを対象とした入力パラメータを持つものは、エラーが発生していなくても行が返されません。 .NETコードの入力パラメータはSqlString
に設定され、データベースにはNVARCHAR(50)
が設定されています。
これは私のC#のコードがどのように見えるかです:
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();
}
}
そして、私は、ストアドプロシージャを実行するとき、私は空の行を取得:また
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)
を、入力パラメータのために、私は前にN
を置きます文字列。
同じテーブルを対象に、ストアドプロシージャAirlineAircraftStoredProcedure
を実行しているとき、私は戻って、すべての行取得しています:
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)
を、私はここで間違って何をしましたか?
これは単なる例ではありますが、そうでない場合は、なぜこれらのCLRストアドプロシージャですか?ネイティブのT-SQLプロキシよりもCLRが特に優れているようなことはしていません。したがって、あなたは利益のためにオーバーヘッドを負っています。 –
あなたは正しいです、これは適切な構文を学ぶための単なる練習です。 – user2371684