【问题标题】:SQL Output contents of a table to stringSQL 将表的内容输出为字符串
【发布时间】:2010-12-27 15:45:26
【问题描述】:

我有一个表,其中包含构成单个 SQL 语句的多行 SQL 命令(对此我很感激,步骤 5 here

我已按照此答案中的示例进行操作,现在有一个 SQL 表 - 每行都是构建查询的 SQL 行。我可以将此表的内容复制并粘贴到一个新的查询窗口中并获取结果,但是由于我缺乏 SQL 知识,我不确定如何将表的内容复制到一个字符串变量中,然后我可以执行.

编辑:我的表中的 SQL 语句包括每行语句 1 行,即

Row1: SELECT * FROM myTable
Row2: WHERE
Row3: col = @value

如果复制到 VARCHAR(MAX) 中,此语句会超过 MAX 限制。

期待您的回复。同时,我会尝试自己。

谢谢

【问题讨论】:

    标签: sql-server tsql


    【解决方案1】:

    您可以使用 coalesce 将列的内容连接成一个字符串,例如

    create table foo (sql varchar (max));
    
    insert foo (sql) values ('select name from sys.objects')
    insert foo (sql) values ('select name from sys.indexes')
    
    declare @sql_output varchar (max)
    set @sql_output = ''       -- NULL + '' = NULL, so we need to have a seed
    select @sql_output =       -- string to avoid losing the first line.
           coalesce (@sql_output + sql + char (10), '')
      from foo
    
    print @sql_output
    

    注意:未经测试,就在我的脑海中,但一个工作示例应该会产生以下输出:

    select name from sys.objects
    select name from sys.indexes
    

    然后您可以使用exec (@sql_output)sp_executesql 执行字符串的内容。

    【讨论】:

    • 很好,谢谢。我唯一遇到的问题是我的表包含的语句比 varchar(max) 可以处理的多。什么是我可以使用的另一种合适的数据类型。如果有帮助,我正在使用 SQL Server 2008。
    【解决方案2】:

    你可以试试这样的

    DECLARE @TABLE TABLE(
            SqlString VARCHAR(MAX)
    )
    
    INSERT INTO @TABLE (SqlString) SELECT 'SELECT 1'
    
    DECLARE @SqlString VARCHAR(MAX)
    
    SELECT  TOP 1 @SqlString = SqlString FROM @TABLE
    
    EXEC (@SqlString)
    

    连接多行的字符串

    DECLARE @Table TABLE(
            ID INT,
            Val VARCHAR(50)
    )
    INSERT INTO @Table (ID,Val) SELECT 1, 'SELECT *'
    INSERT INTO @Table (ID,Val) SELECT 2, 'FROM YourTable'
    INSERT INTO @Table (ID,Val) SELECT 3, 'WHERE 1 = 1'
    
    DECLARE @SqlString VARCHAR(MAX)
    --Concat
    SELECT  DISTINCT 
            @SqlString =
            (
                SELECT  tIn.Val + ' '
                FROM    @Table tIn
                ORDER BY ID
                FOR XML PATH('')
            )
    FROM    @Table t
    
    PRINT @SqlString
    

    【讨论】:

    • 我要转换成字符串的表大于 VARCHAR(MAX)?你能推荐一个合适的数据类型吗?该表包含大约 400 行。谢谢,这几乎就是我想要的。
    • 看看这里 teratrax.com/articles/varchar_max.html。它指出 这些数据类型可以容纳 BLOB 可以容纳的相同数量的数据 (2 GB)
    • 有意思,我的sql查询绝对不超过2GB!!根据您上面的声明,我正在使用 VARCHAR(MAX)。
    • 您是要在执行前连接表中的 sql 字符串,还是一次执行所有条目?似乎是什么问题?
    • 该表包含大约 300 行,每行包含来自单个 SQL 查询的一行(我现在编辑了我的问题以反映这一点,希望这能让它更清楚)。结合使用您的答案和上述相关人员的答案,我尝试“EXEC @sqlString”,但出现错误,因此我使用“print @sqlstring”查看了字符串,我只能看到表中的前 16 行这就是我收到错误的原因。这就是为什么我认为@SqlString 已被最大化!显然不是
    【解决方案3】:

    如果要执行一串 sql 则使用Exec() 或sp_executeSql

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-22
      • 1970-01-01
      • 2015-12-25
      • 1970-01-01
      • 2016-01-19
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      相关资源
      最近更新 更多