Sql 多个动态select语句的内部联接

Sql 多个动态select语句的内部联接,sql,sql-server,sql-server-2008,tsql,sql-server-2005,Sql,Sql Server,Sql Server 2008,Tsql,Sql Server 2005,您好,我需要通过应用@sql变量中每个循环上获得的内部联接来提取公共数据。我想将@sql上的第一个循环获得的结果的内部联接应用到第二个循环,以此类推 例如,我设置了一个值: 1@3@4@kaal#maal#saal,2@5@6nn#mm 在Attributes变量`上运行两次,可能会运行多次。得到的每个结果都应该进行内部联接,最终结果应该存储在其他一些表中 DECLARE @Attributes NVARCHAR(4000) SET @Attributes = '1@3@4@k

您好,我需要通过应用@sql变量中每个循环上获得的内部联接来提取公共数据。我想将@sql上的第一个循环获得的结果的内部联接应用到第二个循环,以此类推

例如,我设置了一个值:

1@3@4@kaal#maal#saal,2@5@6nn#mm
在Attributes变量`上运行两次,可能会运行多次。得到的每个结果都应该进行内部联接,最终结果应该存储在其他一些表中

DECLARE @Attributes NVARCHAR(4000)
        SET @Attributes = '1@3@4@kaal#maal#saal,2@5@6nn#mm'
        DECLARE @ItemAttributes NVARCHAR(4000)
        DECLARE @tblAttributes TABLE (
            RowNum INT identity(1, 1)
            ,Attribute NVARCHAR(1000)
            )

        INSERT INTO @tblAttributes (Attribute)
        SELECT RTRIM(LTRIM(items))
        FROM split(@Attributes, ',')

        DECLARE @Counter INT
            ,@RowCount INT
        DECLARE @sql NVARCHAR(2000)

        SELECT @RowCount = count(RowNum)
        FROM @tblAttributes

        SET @Counter = 1

        WHILE (
                @Counter <= @RowCount
                OR @Counter = 1
                )
        BEGIN
            SELECT @ItemAttributes = Attribute
            FROM @tblAttributes
            WHERE RowNum = @Counter

            DECLARE @tblAttr TABLE (
                RowNum INT identity(1, 1)
                ,Attr NVARCHAR(1000)
                )

            INSERT INTO @tblAttr (Attr)
            SELECT RTRIM(LTRIM(items))
            FROM split(@ItemAttributes, '@')

            DECLARE @AttributeID INT
            DECLARE @InputTypeID INT
            DECLARE @ValidationTypeID INT
            DECLARE @AttributeValue NVARCHAR(4000)

            SELECT @AttributeID = Attr
            FROM @tblAttr
            WHERE RowNum = 1

            SELECT @InputTypeID = Attr
            FROM @tblAttr
            WHERE RowNum = 2

            SELECT @ValidationTypeID = Attr
            FROM @tblAttr
            WHERE RowNum = 3

            SELECT @AttributeValue = Attr
            FROM @tblAttr
            WHERE RowNum = 4

            IF (@InputTypeID = 1)
            BEGIN
                IF (@ValidationTypeID = 3)
                BEGIN
                    SELECT @sql = 'SELECT DISTINCT(ItemID) FROM dbo.Aspx_ItemAttributesValue_Decimal
    WHERE  AttributeValue IN(' + @AttributeValue + ') AND AttributeID =@AttributeID AND (IsDeleted=0 OR IsDeleted IS NULL)'
                END
                ELSE
                    IF (@ValidationTypeID = 5)
                    BEGIN
                        SELECT @sql = 'SELECT DISTINCT(ItemID) FROM dbo.Aspx_ItemAttributesValue_Int
    WHERE  AttributeValue IN(' + @AttributeValue + ') AND AttributeID =@AttributeID AND (IsDeleted=0 OR IsDeleted IS NULL)'
                    END
                    ELSE
                    BEGIN
                        SELECT @sql = 'SELECT DISTINCT(ItemID) FROM dbo.Aspx_ItemAttributesValue_Nvarchar
    WHERE  AttributeValue IN(' + @AttributeValue + ') AND AttributeID =@AttributeID AND (IsDeleted=0 OR IsDeleted IS NULL)'
                    END
            END

            IF (
                    @InputTypeID = 5
                    OR @InputTypeID = 6
                    OR @InputTypeID = 9
                    OR @InputTypeID = 10
                    OR @InputTypeID = 11
                    OR @InputTypeID = 12
                    )
            BEGIN
                SELECT @sql = 'SELECT DISTINCT(ItemID) FROM dbo.Aspx_ItemAttributesValue_Options
    WHERE  AttributeValue IN(' + @AttributeValue + ') AND AttributeID =@AttributeID AND (IsDeleted=0 OR IsDeleted IS NULL)'
            END

            IF (@InputTypeID = 7)
            BEGIN
                SELECT @sql = 'SELECT DISTINCT(ItemID) FROM dbo.Aspx_ItemAttributesValue_Decimal
    WHERE  AttributeValue IN(' + @AttributeValue + ') AND AttributeID =@AttributeID AND (IsDeleted=0 OR IsDeleted IS NULL)'
            END

            SET @Counter = @Counter + 1
        END
试试这个-

DECLARE 
      @Attributes NVARCHAR(2000)
    , @SQL NVARCHAR(MAX)

SELECT @Attributes = '1@3@4@kaal#maal#saal,2@5@6@nn#mm'

DECLARE @tblAttributes TABLE 
(
      RowNum INT IDENTITY(1, 1)
    , Attribute NVARCHAR(1000)
)

INSERT INTO @tblAttributes (Attribute)
SELECT RTRIM(LTRIM(p.value('.', 'NVARCHAR(1000)')))
FROM (
    SELECT field = CAST('<s>' + REPLACE(@Attributes, ',', '</s><s>') + '</s>' AS XML)  
) d
CROSS APPLY field.nodes('/s') t(p)

DECLARE 
      @Counter INT
    , @RowCount INT

SELECT 
      @RowCount = COUNT(RowNum)
    , @Counter = 1
FROM @tblAttributes

WHILE @Counter <= @RowCount OR @Counter = 1 BEGIN

    DECLARE 
          @AttributeID INT
        , @InputTypeID INT
        , @ValidationTypeID INT
        , @AttributeValue NVARCHAR(4000)

    SELECT 
          @AttributeID = [1]
        , @InputTypeID = [2]
        , @ValidationTypeID = [3]
        , @AttributeValue = [4]
    FROM (
        SELECT 
              Attribute = RTRIM(LTRIM(p.value('.', 'NVARCHAR(4000)')))
            , rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
        FROM (
            SELECT field = CAST('<s>' + REPLACE(Attribute, '@', '</s><s>') + '</s>' AS XML)  
            FROM @tblAttributes
            WHERE RowNum = @Counter
        ) d
        CROSS APPLY field.nodes('/s') t(p)
    ) r
    PIVOT
    (
        MAX(Attribute)
        FOR rn IN ([1], [2], [3], [4])
    )p

    SELECT @SQL = 
    CASE 
        WHEN @InputTypeID = 1 
            THEN 
            CASE 
                WHEN @ValidationTypeID = 3 
                    THEN 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Decimal
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
                WHEN @ValidationTypeID = 5
                    THEN 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Int
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
                ELSE 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Nvarchar
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
            END
        WHEN @InputTypeID IN (5, 6, 9, 10, 11, 12) 
            THEN 'SELECT DISTINCT(ItemID) 
                  FROM dbo.Aspx_ItemAttributesValue_Options 
                  WHERE AttributeValue IN (' + @AttributeValue + ') 
                      AND AttributeID = @AttributeID AND ISNULL(IsDeleted, 0) = 0'
        WHEN @InputTypeID = 7 
            THEN 'SELECT DISTINCT(ItemID) 
                  FROM dbo.Aspx_ItemAttributesValue_Decimal 
                  WHERE AttributeValue IN (' + @AttributeValue + ') 
                      AND AttributeID = @AttributeID AND ISNULL(IsDeleted, 0) = 0'
    END

    SET @Counter = @Counter + 1

END

SELECT @SQL
试试这个-

DECLARE 
      @Attributes NVARCHAR(2000)
    , @SQL NVARCHAR(MAX)

SELECT @Attributes = '1@3@4@kaal#maal#saal,2@5@6@nn#mm'

DECLARE @tblAttributes TABLE 
(
      RowNum INT IDENTITY(1, 1)
    , Attribute NVARCHAR(1000)
)

INSERT INTO @tblAttributes (Attribute)
SELECT RTRIM(LTRIM(p.value('.', 'NVARCHAR(1000)')))
FROM (
    SELECT field = CAST('<s>' + REPLACE(@Attributes, ',', '</s><s>') + '</s>' AS XML)  
) d
CROSS APPLY field.nodes('/s') t(p)

DECLARE 
      @Counter INT
    , @RowCount INT

SELECT 
      @RowCount = COUNT(RowNum)
    , @Counter = 1
FROM @tblAttributes

WHILE @Counter <= @RowCount OR @Counter = 1 BEGIN

    DECLARE 
          @AttributeID INT
        , @InputTypeID INT
        , @ValidationTypeID INT
        , @AttributeValue NVARCHAR(4000)

    SELECT 
          @AttributeID = [1]
        , @InputTypeID = [2]
        , @ValidationTypeID = [3]
        , @AttributeValue = [4]
    FROM (
        SELECT 
              Attribute = RTRIM(LTRIM(p.value('.', 'NVARCHAR(4000)')))
            , rn = ROW_NUMBER() OVER (ORDER BY (SELECT 1))
        FROM (
            SELECT field = CAST('<s>' + REPLACE(Attribute, '@', '</s><s>') + '</s>' AS XML)  
            FROM @tblAttributes
            WHERE RowNum = @Counter
        ) d
        CROSS APPLY field.nodes('/s') t(p)
    ) r
    PIVOT
    (
        MAX(Attribute)
        FOR rn IN ([1], [2], [3], [4])
    )p

    SELECT @SQL = 
    CASE 
        WHEN @InputTypeID = 1 
            THEN 
            CASE 
                WHEN @ValidationTypeID = 3 
                    THEN 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Decimal
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
                WHEN @ValidationTypeID = 5
                    THEN 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Int
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
                ELSE 'SELECT DISTINCT(ItemID) 
                          FROM dbo.Aspx_ItemAttributesValue_Nvarchar
                          WHERE AttributeValue IN (' + @AttributeValue + ') 
                              AND AttributeID =@AttributeID AND ISNULL(IsDeleted, 0) = 0'
            END
        WHEN @InputTypeID IN (5, 6, 9, 10, 11, 12) 
            THEN 'SELECT DISTINCT(ItemID) 
                  FROM dbo.Aspx_ItemAttributesValue_Options 
                  WHERE AttributeValue IN (' + @AttributeValue + ') 
                      AND AttributeID = @AttributeID AND ISNULL(IsDeleted, 0) = 0'
        WHEN @InputTypeID = 7 
            THEN 'SELECT DISTINCT(ItemID) 
                  FROM dbo.Aspx_ItemAttributesValue_Decimal 
                  WHERE AttributeValue IN (' + @AttributeValue + ') 
                      AND AttributeID = @AttributeID AND ISNULL(IsDeleted, 0) = 0'
    END

    SET @Counter = @Counter + 1

END

SELECT @SQL

从dbo.Aspx_ItemAttributesValue_选项中选择differentitemid,其中AttributeValue在'Cotton'中,AttributeID=5,ISNULLIsDeleted,0=0内部连接从dbo.Aspx_ItemAttributesValue_选项中选择differentitemid,其中AttributeValue在'Man'中,AttributeID=6,ISNULLIsDeleted,0=0。上面的代码只返回两个select语句问题是我如何加入这个动态select语句。谢谢,我终于得到了解决方案。。。!从dbo.Aspx_ItemAttributesValue_选项中选择differentitemid,其中AttributeValue在'Cotton'中,AttributeID=5,ISNULLIsDeleted,0=0内部连接从dbo.Aspx_ItemAttributesValue_选项中选择differentitemid,其中AttributeValue在'Man'中,AttributeID=6,ISNULLIsDeleted,0=0。上面的代码只返回两个select语句问题是我如何加入这个动态select语句。谢谢,我终于得到了解决方案。。。!