【问题标题】:Using dynamic SQL to specify a column name by adding a variable to simple sql query使用动态 SQL 通过向简单 sql 查询中添加变量来指定列名
【发布时间】:2011-10-30 17:17:49
【问题描述】:

sql 2005/sql 2008

Declare @temp nvarchar(1000)

set @temp = 'ABC'


select col1,col2 from tableA

与选择查询一起,如何在选择查询中添加变量?

expected output :-

select col1,col2,@temp as [col3] from tableA

@temp 指定 tableA 中列的名称。

【问题讨论】:

  • 您的代码有什么问题?你有错误吗?它们是什么?
  • 是的,这是一个简单的语法错误。表中没有列名@temp:tableA。所以它会抛出错误
  • 尝试从 tableA 中选择 col1,col2,'ABC' as [col3]
  • 某些语言“本机”支持这种结构 例如,在 Foxpro 中,您可以在变量前面加上“&”,这会告诉编译器将值连接到查询中。称为宏替换的过程。它非常强大,但不允许执行现代 rdbms 的许多重要步骤,并且允许 SQL 注入。
  • 我必须同意 Stephanie Page

标签: sql sql-server-2005 sql-server-2008


【解决方案1】:

如果您尝试动态指定列名,您可以查看执行动态 sql。但是,您应该确保首先了解这种方法的危险:

http://www.sommarskog.se/dynamic_sql.html

在该页面中,有一个示例显示动态指定表名 - 您可以更改它以便动态指定列名:

CREATE PROCEDURE general_select @tblname nvarchar(128),
                                @key     varchar(10),
                                @debug   bit = 0 AS
DECLARE @sql nvarchar(4000)
SET @sql = 'SELECT col1, col2, col3
            FROM dbo.' + quotename(@tblname) + '
            WHERE keycol = @key'
IF @debug = 1 PRINT @sql
EXEC sp_executesql @sql, N'@key varchar(10)', @key = @key

例如,如果您有一个表“MyTable”,其中包含名为“x”、“y”和“z”的列,它可能如下所示:

DECLARE @columnName nvarchar(128)
DECLARE @sql nvarchar(4000)
set @columnName = 'z'

SET @sql = 'SELECT x, y, ' + @columnName + ' from MyTable'
EXEC sp_executesql @sql, N'@columnName varchar(128)', @columnName = @columnName

【讨论】:

  • select * from [udf_ComplianceMembers] (@PatId) :- 这是我的实际查询,我需要向其中添加动态列/变量:@Compliance。我不知道如何给它添加动态列
  • 这是怎么做的,但在你这样做之前看这里en.wikipedia.org/wiki/SQL_injection
  • 你为什么要连接 + @columnName + 将它作为参数传递给 sp_executesql?
  • @stepahniepage,我读过那篇文章。我们此查询的目的是用于内部/生成报告,而不是用于商业!所以,我想我们不必担心 sql 注入
【解决方案2】:

类似这样的:

select col1,col2 from tableA WHERE col1 = @temp

或者这个:

select col1,col2,@temp as col3 from tableA WHERE col1 = @temp

或者这个:

select col1,col2,@temp as col3 from tableA

或者如果@temp 是一个列名,那么也许您正在寻找一个动态查询?

 SET @temp = 'select col1,col2, ' + @temp + ' as col3 from tableA'
 EXEC sp_executesql @temp

...

【讨论】:

  • 是的,我正在通过添加动态列名来查找动态 SQL 查询!!
  • select * from [udf_ComplianceMembers] (@PatId) :- 这是我的实际查询,我需要向其中添加动态列/变量:@Compliance。我不知道如何给它添加动态列
  • 您需要将@Compliance 添加到您的UDF (TVF) 中吗?您始终可以将其传入...但您需要更新 UDF 才能使用它。您的 UDF 的代码是什么?
  • 你能帮我写一下语法吗,我不知道如何通过或者你到底想说什么
  • 从 [udf_ComplianceMembers] (@PatId, @Compliance) 中选择 *
猜你喜欢
  • 2020-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-02
  • 1970-01-01
  • 2014-06-05
相关资源
最近更新 更多