繁体   English   中英

Python SQL Server - 从现有表中的值创建表

[英]Python SQL Server - Create Table from Values from an existing Table

我正在寻找一种解决方案,如何使用 python 或 sql 从此数据(位于 sql 数据库中名为“table1”的表上)创建一个表

表名 柱子 数据类型 长度
一个 1 varchar 5
一个 2 日期 0
一个 3 漂浮 0
b 1 varchar 10
b 2 varchar 8
b 3 漂浮 0
b 4 varchar 50
C 1 日期 0
C 2 varchar 6

目标是创建表(a,b,c)

它们的列和它们的数据类型也可以在同一个表中找到

棘手的部分是,“table1”的值总是不同的(动态表名、列名、数据类型和长度),所以我需要编写一个代码,它可以引用“table1”中的值并使用它们创建所有表在“table1”中找到的列(+数据类型)

我已经知道了

DECLARE @n INT = (SELECT COUNT(DISTINCT TABNAME) FROM dbo.Tablenames),
    @i INT = '1',
    @query VARCHAR(4000)

WHILE @n >= @i
BEGIN
DECLARE @tablename VARCHAR(255) = (Select Top 1 TABNAME FROM 
dbo.Tablenames),
        @columnname VARCHAR(255), --not properly declared
        @datatype VARCHAR(255),   --not properly declared
        @length VARCHAR(255)      --not properly declared
SELECT TOP 1 @tablename
FROM dbo.Tablenames
SET @query = N'CREATE TABLE' + QUOTENAME(@tablename) + 
    '(' +
    @columnname + @datatype + '(' + @length + ')' --this part needs if statement (if not varchar = no '+ '(' + @length + ')''
    + ')'  
EXEC (@query)

SET @i+=1

DELETE FROM dbo.Tablenames
WHERE TABNAME = @tableName
END

提前致谢

您可以为此使用动态 SQL。

您只需使用STRING_AGG聚合整个内容。 您需要两个级别的聚合,一次用于列,然后再次用于表。 这为您提供了一个可以执行的大脚本。

DECLARE @sql nvarchar(max) = (
    SELECT STRING_AGG(CONCAT(
      'CREATE TABLE ',
      QUOTENAME(t1.tablename),
      ' (
',
      t1.columns,
      '
);'
    ), '
')
    FROM (
        SELECT
          t1.tablename,
          columns = STRING_AGG(CAST(CONCAT(
            '  ',
            QUOTENAME(t1.[column]),
            ' ',
            t1.datatype,
            CASE WHEN t1.datatype = 'varchar' THEN CONCAT('(', t1.length, ')') END
          ) AS nvarchar(max)), ',
')
        FROM table1 t1
        GROUP BY
          t1.tablename
    ) t1
);

PRINT @sql;

EXEC sp_executesql @sql;

db<>小提琴

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM