【发布时间】:2011-01-20 16:29:27
【问题描述】:
我是编写 SQL 的新手,非常感谢有关此问题的帮助。 :)
我正在尝试将整行选择成一个字符串,最好用空格或逗号分隔。我想以一种通用的方式完成此操作,而不必了解表中列的详细信息。
我想做的是:
DECLARE @MyStringVar NVARCHAR(MAX) = ''
@MyStringVar = SELECT * FROM MyTable WHERE ID = @ID AS STRING
但我最终做的是:
DECLARE @MyStringVar = ''
DECLARE @SecificField1 INT
DECLARE @SpecificField2 NVARCHAR(255)
DECLARE @SpecificField3 NVARCHAR(1000)
...
SELECT @SpecificField1 = Field1, @SpecificField2 = Field2, @SpecificField3 = Field3 FROM MyTable WHERE ID = @ID
SELECT @StringBuilder = @StringBuilder + CONVERT(nvarchar(10), @Field1) + ' ' + @Field2 + ' ' + @Field3
哎呀。 :(
我看到一些人发布了关于 COALESCE 函数的内容,但同样,我还没有看到有人在没有特定列名的情况下使用它。
另外,我在想,也许有一种方法可以通过以下方式动态使用列名:
SELECT [COLUMN_NAME] FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'MyTable'
这看起来真的不应该这么复杂。 :(
我所做的工作目前有效,但提前感谢任何可以为我指出更好解决方案的人。 :)
编辑: 已解决,感谢所有回答的人。 :)
【问题讨论】:
-
您能解释一下您的最终目标是什么吗?如果我们能更好地理解这一点,我们或许可以提出更好的解决方案。
-
我也很好奇这样一个通用例程的目的。我不会在生产代码中使用任何这样的解决方案。
-
我的总体目标是跟踪数据库中的删除(通过触发器)并将更改写入日志文件。我想要字符串,因为我试图将一行作为参数传递给一个 DLL 函数(用 C# 编写,将行作为字符串),该函数将删除的数据写入日志文件。我想要一个通用的方法,因为我可能必须为数据库中的每个表编写这个触发器。不幸的是,msdn 页面说 DDL 触发器不跟踪行删除,所以看来我必须一遍又一遍地编写这个触发器。如果是这种情况,我至少想动态调整对表格所做的任何更改。
-
@Brandi,我会手动编写触发器以提高速度(根据需要和数据类型为每个触发器编写准确的列和必要的格式),为什么要增加查找的开销每次触发触发时的列?您可以轻松修改我的答案中的查询,该查询使用 INFORMATION_SCHEMA.COLUMNS,为每个表生成 INSERT 代码。
-
首先,我假设您要跟踪 DML 而不是 DDL。上述解决方案不适用于 DDL。 SQL Server (2k,2k5,2k8) 触发器肯定会在删除时触发。在上述解决方案中,如果列顺序发生变化,您的输出将出现乱码。坦率地说,我认为编写一个脚本来编写触发器(或使用 3rd 方程序,或 2k8 的更改跟踪)比使用这种方法更好,但我不知道你问题的所有细节。
标签: sql sql-server tsql string dynamic