Sql 将列过程插入表中

Sql 将列过程插入表中,sql,sql-server-2008,stored-procedures,Sql,Sql Server 2008,Stored Procedures,我有一个关于将列存储过程插入表的问题。 我有两张桌子,大约100行和1百万行。 基本上,我有一个函数,通过比较不同表中的两个数据来返回int。 我想对每个数据组合运行函数 表1~100行 Col1 A B C D 表2~1百万行 Col1 1 2 3 4 函数i,j,其中i来自表1,j来自表2 简而言之,代码如下: whil

我有一个关于将列存储过程插入表的问题。 我有两张桌子,大约100行和1百万行。 基本上,我有一个函数,通过比较不同表中的两个数据来返回int。 我想对每个数据组合运行函数

表1~100行

Col1                
A                   
B                   
C                   
D  
表2~1百万行

Col1  
1  
2  
3  
4  
函数i,j,其中i来自表1,j来自表2 简而言之,代码如下:

while i < count(*) table 1  
   print i  
   while j < count(*) table 2  
   select function(i,J)  
   J = J + 1  
   end  
i = i + 1  
j = 0  
end  
我想显示上面的结果,就像表动态地将列名分配给I一样

i(1)        i(2)        i(3) .....  
1           1           5  
3           2           9  
4           3           4  

提前感谢。

这将是昂贵的,100000000个结果!SQlserver对此的支持非常差

要使用sp_交叉表,它不在任何人最想做的事情列表的顶部,您需要三列

那就是‘I’、‘J’和‘fi,J’

代替while循环,您可以执行通常是错误的操作

选择Table1.Col1、Table2.Col1、函数Table1.Col1、Table2.Col2 从表1到表2

或者从表1加入表2

这将为您提供一个笛卡尔积,表1中的所有100条记录与表2中的所有1000000条记录合并。 将其正确地传递到sp_交叉表中,您将为表2中的每一个值获得一行,为表1中的每一行获得一列,并在单元格中保留函数的结果

话虽如此,如果这有点慢,并且可能会占用一点内存,请不要感到惊讶


您可能需要在较小的范围内进行尝试。

要获得所需的输出,请参见下面的编码,我已经进行了完美的编码,因此您只需要更改表名,并在代码块的注释区域中相应地调用您的函数

DECLARE @rest INT,
        @rev INT,
        @counter INT,
        @Table1Count INT,
        @Table2Count INT
DECLARE @colName VARCHAR(50),
        @Fields NVARCHAR(MAX),
        @Sql VARCHAR(MAX)

SELECT @colName = 'Col', @Fields = '', @rest = 1, @rev = 1, @counter = 1
SELECT @Table1Count = count(*) from Table1
SELECT @Table2Count = count(*) from Table2

CREATE TABLE #temp (ID INT IDENTITY(1,1), defaultColumn VARCHAR(50))
WHILE @rest <= @Table2Count
    BEGIN
        INSERT INTO #temp (defaultColumn) VALUES(@rest)
        SET @rest = @rest + 1
    END

WHILE @counter <= @Table1Count
    BEGIN
        PRINT(CAST(@counter AS VARCHAR))
        SET @colName = @colName+CAST(@counter AS VARCHAR)
        SET @Fields = @Fields + @colName
        IF @counter <> @Table1Count
        BEGIN
            SELECT @Fields = @Fields +', '
        END
        EXEC ('ALTER TABLE #temp ADD '+ @colName +' VARCHAR(250)')

        WHILE  @rev <= @Table2Count
            BEGIN
                -------------------------------------------------
                -- Some modification may need to your Function
                -- CALL YOUR FUNCTIN HERE
                -------------------------------------------------
                SET @Sql = 'UPDATE #temp SET '+ @colName +' = '+ CAST( @rev AS VARCHAR) 
                            +' WHERE defaultColumn = '+ CAST( @rev AS VARCHAR)
                EXEC (@Sql)
                SET @rev = @rev + 1
            END 

        SELECT @rev = 1, @counter = @counter +1, @colName = 'Col'
    END
 EXEC('SELECT '+ @Fields + ' FROM #temp')
 DROP TABLE #temp
请记住,根据您使用的MSSQL Server版本,尝试使用低于表中允许的最大列数的列


希望这将对您非常有帮助,谢谢您的时间

这将是我的解决方案:

DECLARE @columns VARCHAR(MAX)

SELECT @columns = COALESCE(@columns + ',[' + CAST(t1.i as varchar(10)) + ']'
                           ,'[' + CAST(t1.i as varchar(10)) + ']')
FROM t1

DECLARE @query VARCHAR(MAX)
SET @query = '
    SELECT * FROM
    (
        SELECT t1.i, t2.j, yourFunction(t1.i, t2.j) as functionResult
        FROM t1
        CROSS JOIN t2
    ) as tbl3
    PIVOT
    (
        SUM(functionResult) FOR i in (' + @columns + ')
    ) AS tblResults'

EXECUTE (@query)​
您可以查看这方面的一个工作示例

编辑
为了澄清,您将用两个表的实际名称替换t1和t2。同样在SEDE示例中,我刚刚将I和j加在一起,t1.I+t2.j作为functionResult,因为我无法在上面创建函数,但您只需调用您的函数,就像我在回答中显示的那样,您的函数t1.I,t2.j作为functionResult。

您的函数对I和j做了什么?也许有一些方法,尽管100000000次计算是一次延伸,但不包括打印。啊现在我see@cesar函数的作用是找出i和j之间的相关性。它给出0到15之间的整数。感谢您提供的信息。我会跑回去的。非常感谢。交叉连接对我想要实现的目标有着完美的意义。谢谢你的快速和伟大的提示!
DECLARE @columns VARCHAR(MAX)

SELECT @columns = COALESCE(@columns + ',[' + CAST(t1.i as varchar(10)) + ']'
                           ,'[' + CAST(t1.i as varchar(10)) + ']')
FROM t1

DECLARE @query VARCHAR(MAX)
SET @query = '
    SELECT * FROM
    (
        SELECT t1.i, t2.j, yourFunction(t1.i, t2.j) as functionResult
        FROM t1
        CROSS JOIN t2
    ) as tbl3
    PIVOT
    (
        SUM(functionResult) FOR i in (' + @columns + ')
    ) AS tblResults'

EXECUTE (@query)​