Хранимая процедура может иметь динамические параметры, которые будут использоваться в “В” пункте?

Помимо обычных методов отладчика и аспектно-ориентированного программирования, вы также можете вводить свои собственные инструментальные функции, используя опции командной строки gcc -finstrument-functions . Вам нужно будет реализовать свои собственные функции __cyg_profile_func_enter() и __cyg_profile_func_exit() (объявите их как extern "C" в C ++).

Они предоставляют средства для отслеживания того, какая функция была вызвана откуда. Однако интерфейс немного сложен в использовании, поскольку, например, адрес вызываемой функции и ее сайт вызова передаются вместо имени функции. Вы можете записать адреса, а затем извлечь соответствующие имена из таблицы символов, используя что-то вроде objdump --syms или nm , при условии, конечно, символы не были удалены из двоичные файлы.

Это может быть проще в использовании gdb. YMMV. :)

6
задан orandov 10 June 2009 в 17:29
поделиться

6 ответов

В зависимости от вашей версии Sql Server, вы можете сделать это одним из двух разных способов.

Для Sql 2000/2005 вы можете использовать параметр (тип varchar) с разделителями список идентификаторов. Создайте UDF, который будет анализировать varchar и возвращать таблицу, содержащую элементы. Затем сделайте так, чтобы ваше предложение IN соответствовало таблице (т.е. ... IN (выберите ID FROM @ReturnTable)).

Вот пример того, как будет выглядеть содержимое UDF: http://pietschsoft.com/post/2006/02/03/T-SQL-Parse-a-delimited-string.aspx

Для Sql 2008 вы можете сделать то же самое; однако вместо передачи параметра varchar вы можете просто перейти к делу и передать параметр таблицы. В предложении IN по-прежнему будет подзапрос, но он все равно будет работать. В качестве альтернативы, когда у вас есть таблица, вы можете просто выполнить для нее внутреннее соединение и обойти необходимость в предложении IN.

EDIT: добавлен UDF для анализа ссылки строки с разделителями.

8
ответ дан 8 December 2019 в 13:48
поделиться

Решение, описанное здесь:

Массивы и списки в SQL Server 2005

Текст SQL Эрланда Соммарскога, SQL Server MVP

http://www.sommarskog.se/ array-in-sql-2005.html

5
ответ дан 8 December 2019 в 13:48
поделиться

Вы можете сделать это в хранимой процедуре.

создайте временную таблицу внутри хранимой процедуры и вставьте значения, разделенные запятыми или любым разделителем, затем сделайте это

SELECT * FROM Studio WHERE Id IN (select id from temptable)

Затем удалите таблицу.

3
ответ дан 8 December 2019 в 13:48
поделиться

В SQL 2008 вы можете использовать параметр с табличным значением .

В SQL 2005 вы должны использовать динамический SQL, если вы не хотите передавать список как XML и использовать XML-обработку в процедуре, чтобы разрезать XML обратно в табличную переменную.

0
ответ дан 8 December 2019 в 13:48
поделиться

объявить таблицу @temp и разбить на нее значения. тогда вы можете сделать

select * из внутреннего соединения Studio @temptable tb на s.ID = tb.ID

0
ответ дан 8 December 2019 в 13:48
поделиться

Вот UDF, который я ' я использую с MSSQL 2000. Я где-то это нашел - извините, не могу вспомнить где.

В принципе, вы можете выполнить соединение в UDF, где первый параметр - это строка с разделителями, а второй параметр - разделитель .

SELECT t1.somecolumn FROM sometable t1 INNER JOIN dbo.Split (@delimitedVar, ',') t2 ON t1.ID = t2.Element

CREATE FUNCTION [dbo].[Split]
(
@vcDelimitedString varchar(max),
@vcDelimiter varchar(100)
)
RETURNS @tblArray TABLE
   (
    ElementID smallint  IDENTITY(1,1), --Array index
    Element varchar(1000) --Array element contents
   )
AS
BEGIN
    DECLARE @siIndex smallint, @siStart smallint, @siDelSize smallint
    SET @siDelSize  = LEN(@vcDelimiter)
    --loop through source string and add elements to destination table array
    WHILE LEN(@vcDelimitedString) > 0
    BEGIN
        SET @siIndex = CHARINDEX(@vcDelimiter, @vcDelimitedString)
        IF @siIndex = 0
        BEGIN
            INSERT INTO @tblArray VALUES(@vcDelimitedString)
            BREAK
        END
        ELSE
        BEGIN
            INSERT INTO @tblArray VALUES(SUBSTRING(@vcDelimitedString, 1,@siIndex - 1))
            SET @siStart = @siIndex + @siDelSize
            SET @vcDelimitedString = SUBSTRING(@vcDelimitedString, @siStart , LEN(@vcDelimitedString) - @siStart + 1)
        END
    END
    RETURN
END
1
ответ дан 8 December 2019 в 13:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: