假设我在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
我该怎么做?
答案 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
存储过程以将值插入表中:
创建dbo.sProcExec
存储过程以执行存储过程:
SET @Var =
或SELECT @Var =
)select @Variable
这样你就不必对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_STRING
。 Learn more Here