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