如何将变量名称转换为字符串名称?

时间:2017-09-03 08:04:40

标签: sql sql-server tsql sql-server-2012

假设我在SQL Server 2012中有以下SQL代码段:

DECLARE @fname varchar(20), @strVarName varchar(50)
SET @fname = 'cronus'

SET @strVarName = COVERT_VARIABLE_TO_STRING_NAME ( @fname)

--this should return '@fname'. this is not a value conversion this is converting a variable name to a string name 
SELECT @strVarName 

我该怎么做?

5 个答案:

答案 0 :(得分:0)

SQL Server不支持reflection。您可以从目录视图中检索列名或表名,但使用变量则运气不佳。也许你会找到用动态SQL解决这个问题的另一种方法。

答案 1 :(得分:0)

使用动态SQL查询

DECLARE @fname varchar(20), @sql varchar(MAX)
SET @fname = 'cronus'

SET @sql = 'SELECT ' + @fname

EXEC (@sql)

答案 2 :(得分:0)

以下字符数据类型用于存储字符串:

char,
varchar,
nvarchar,
text,

如果你已经将变量用作String,那么为什么需要转换为字符串

    DECLARE @fname varchar(20), @strVarName varchar(50)
    SET @fname = 'cronus'

    SET @strVarName =  @fname

    SELECT @strVarName 

如果需要,使用CAST和CONVERT函数

答案 3 :(得分:0)

这是一个奇怪的问题,听起来像我试图做的事情。

嗯,SQL不应该这样做,但我想,这并不意味着你无法做到。

我认为你实际上必须编写自己的流程来解决这个问题,这有点像:

创建dbo.sProcInserts存储过程以将值插入表中:

  • 将VariableName,Value和可能的表名作为参数插入

创建dbo.sProcExec存储过程以执行存储过程:

  • 执行前,将存储过程读入变量
  • 查找所有SET变量(即他们有SET @Var =SELECT @Var =
  • 在每个变量集之后,在您的字符串中添加一行,该行使用变量名称和select @Variable
  • 调用dbo.sProcInserts
  • 执行新编写的存储过程

这样你就不必对sProcs进行任何修改,它应该通过你的程序捕捉变量及其变化的流程

答案 4 :(得分:-1)

然而,这个要求本身对我来说有点奇怪,但这里有一个方法可能是一个很好的起点:

declare @var1 int
Set @var1= 1
--some code here
declare @var2 nvarchar(max)
set @var2 = 10
--some other code here
declare @var3 bit

print @@VERSION
print 'this is fake @value inside a string'

--$ This is a Hint to help me find the Query that should parsed
declare @sql varbinary(max)
select @sql=sql_handle 
from sys.sysprocesses
where spid=56

declare @q nvarchar(max)
select @q=  substring(text,1,charindex('$',text)-3) from sys.dm_exec_sql_text(@sql)

Select distinct rtrim(ltrim(substring(Name,1,charindex(' ',Name)))) as Name from(
    Select substring(replace(Name,'=',' '),8, Len(Name)) as Name from dbo.SplitString(@q,'declare ')
    ) as K
    where Name like '@[^@]%'

通过运行上述查询,您将获得变量名称。 输出:

@var1
@var2
@var3

您可以找到SplitString函数Here的源代码 注意:如果您使用的是SQL Server 2016且数据库的兼容级别等于或大于130,那么您也可以使用Microsoft自己引入的SPLIT_STRINGLearn more Here