Нормальный/быстрый метод для передачи переменных списков параметров хранимой процедуре SqlServer2008

Установите переменную prevClick, затем обновите и проверьте ее:

var prevClick = false;
function buttonOnClick() {
    if (prevClick) {
        window.open('https://www.youtube.com/channel/UCXE6pw29K2lHS_2fB8LeU1Q?sub_confirmation=1','_blank');
        setTimeout(aTagChange, 12000);
    } else {
        prevClick = true;
    }
}
5
задан Community 23 May 2017 в 12:19
поделиться

2 ответа

Да, я бы определенно посмотрел на Табличные значения параметров для этого. Дополнительным преимуществом может быть то, что вы можете использовать красивую, чистую реализацию на основе набора для внутренних функций вашей процедуры напрямую, без какого-либо массива данных.

Вот еще одна ссылка ...

7
ответ дан 14 December 2019 в 04:47
поделиться

Вот довольно быстрый метод разделения строк с использованием только T-SQL, а входным параметром является только строка. Вам необходимо иметь таблицу и функцию (как описано ниже), уже настроенную для использования этого метода.

создать эту таблицу:

CREATE TABLE Numbers (Number  int not null primary key identity(1,1))
DECLARE @n int
SET @n=1
SET IDENTITY_INSERT Numbers ON
WHILE @N<=8000
BEGIN
    INSERT INTO Numbers (Number) values (@n)
    SET @n=@n+1
END
SET IDENTITY_INSERT Numbers OFF

создать эту функцию для разделения массива строк (у меня есть другие версии, где пустые разделы исключены и те, которые не возвращают номера строк):

CREATE FUNCTION [dbo].[FN_ListAllToNumberTable]
(
     @SplitOn              char(1)              --REQUIRED, the character to split the @List string on
    ,@List                 varchar(8000)        --REQUIRED, the list to split apart
)
RETURNS
@ParsedList table
(
    RowNumber int             --REQUIRED, the list to split apart
   ,ListValue varchar(500)    --OPTIONAL, the character to split the @List string on, defaults to a comma ","

)
AS
BEGIN

--this will return empty rows, and row numbers
INSERT INTO @ParsedList
        (RowNumber,ListValue)
    SELECT
        ROW_NUMBER() OVER(ORDER BY number) AS RowNumber
            ,LTRIM(RTRIM(SUBSTRING(ListValue, number+1, CHARINDEX(@SplitOn, ListValue, number+1)-number - 1))) AS ListValue
        FROM (
                 SELECT @SplitOn + @List + @SplitOn AS ListValue
             ) AS InnerQuery
            INNER JOIN Numbers n ON n.Number < LEN(InnerQuery.ListValue)
        WHERE SUBSTRING(ListValue, number, 1) = @SplitOn

RETURN

END 
go

вот пример того, как разделить параметр на части:

CREATE PROCEDURE TestPass
(
    @ArrayOfInts    varchar(255)  --pipe "|" separated list of IDs
)
AS

SET NOCOUNT ON

DECLARE @TableIDs  TABLE (RowNumber int, IDValue int null)

INSERT INTO @TableIDs (RowNumber, IDValue)  SELECT RowNumber,CASE WHEN LEN(ListValue)<1 then NULL ELSE  ListValue END FROM dbo.FN_ListAllToNumberTable('|',@ArrayOfInts)

SELECT * FROM @TableIDs
go

это основано на: http://www.sommarskog.se/arrays-in -sql.html

1
ответ дан 14 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

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