Как получить параметр sql_variant для хранимой процедуры SQL CLR? - PullRequest
5 голосов
/ 08 декабря 2010

Как добавить параметр sql_variant в хранимую процедуру SQL CLR?Использование System.Object не работает, и я не вижу никаких атрибутов, которые я могу использовать.

[Microsoft.SqlServer.Server.SqlProcedure]
public static void ClearOnePartition(
    SqlString aString
    , /* I want this to be a sql_variant */ object aVariant
)
{
    //do stuff here
}

Ответы [ 2 ]

3 голосов
/ 13 декабря 2010

In Отображение данных параметров CLR из SQL Books Online, Объект указан как правильный тип для использования для отображения sql_variant .

Я создал простой проект SQL Server и добавил к нему следующий класс:

public partial class StoredProcedures
{
    [Microsoft.SqlServer.Server.SqlProcedure]
    public static void StoredProcedure1(object param1)
    {
        // Put your code here
        //Trace.Write(param1);
        SqlContext.Pipe.Send(param1.ToString());

    }
};

Затем я изменил файл test.sql, чтобы выполнить этот сохраненный процесс:

DECLARE @thing sql_variant = 'hahahahaha';

EXEC dbo.StoredProcedure1 @thing

Это выполняется какожидается и выдает следующий вывод:

хахахахаха

Строки не затронуты.

(возвращено 0 строк)

Завершено выполнение sp_executesql.

1 голос
/ 28 августа 2015

Значения границ раздела, как показано в документации CREATE PARTITION FUNCTION , могут быть одного из многих различных типов:

Все типы данных действительны для использования в качестве столбцов разделения, кроме текста, ntext, image, xml, отметки времени, varchar (max), nvarchar (max), varbinary (max), псевдонимов данных или пользовательских данных CLR типы.

И их фактический тип данных хранится в sys.partition_parameters .

Но если кто-то выбирает их из sys.partition_range_values ​​, то поле value имеет тип SQL_VARIANT (и по понятной причине, очевидно).

Да, SQL_VARIANT (как уже говорилось) сопоставляется с object в .NET.

Если вам нужно проверить NULL, сравните объект с DBNull.Value.

Если вы хотите знать базовый тип значения в объекте (скорее всего, оно не будет SQL_VARIANT / object), используйте метод GetType():

if (aVariant.GetType() == typeof(SqlInt16))
...