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

vs91vp4v  于 2023-01-12  发布在  其他
关注(0)|答案(6)|浏览(176)

假设我在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

我该怎么做呢?

xpszyzbs

xpszyzbs1#

SQL Server不支持reflection。您可以从其目录视图中检索列名或表名,但如果使用变量,就不太走运了。也许您可以使用动态SQL找到解决此问题的其他方法。

iq3niunx

iq3niunx2#

使用动态sql查询

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

SET @sql = 'SELECT ' + @fname

EXEC (@sql)
qzlgjiam

qzlgjiam3#

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

char,
varchar,
nvarchar,
text,

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

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

    SET @strVarName =  @fname

    SELECT @strVarName

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

juzqafwq

juzqafwq4#

这是一个奇怪的问题,听起来像是我会尝试的。
嗯,SQL不应该这样做,但我想,这并不意味着你不能做到这一点。
我认为您实际上必须编写自己的流程来完成此任务,沿着:
创建dbo.sProcInserts存储过程以将值插入表中:

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

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

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

这样,实际上不必对sProc进行任何修改,它应该捕获变量流及其在过程中的更改

isr3a4wc

isr3a4wc5#

对于那些“初学者”来说,你可能不应该回答任何问题,因为你很难理解所提出的问题。ORRR...你认为问题比实际简单。在C#中,现在你有nameof(...),以便您可以添加类、变量、等到字符串(用于任何目的)。我相信高级程序员会找到它的用途。不那么高级的程序员(即使高级程序员仍然处于初级水平)无法理解原因。无论如何...有一种方法来获得变量作为名称在C#中很方便,在SQL Server中也会很方便。变通方法看起来很愚蠢,但至少有人做了一次尝试,我相信我们能理解这一点。想知道原因的必要性也很荒谬:“为什么”并不总是重要的。人们有他们的理由。如果你不知道,你就不要评论。如果你知道,那么分享吧。我们会感激你的。如果你不理解这个问题,请随时要求澄清。没有人需要向贫穷的程序员或一开始就有愤怒问题的程序员证明理由:-)所以,我把这个问题看作是SQL Server版本的nameof({variable name}),它只是把变量名作为字符串......简单,对吗?没有转换......不谈论变量的内容。只是变量名。天啊,有些程序员的沟通能力太有限,不先生气。:-)

lp0sw83n

lp0sw83n6#

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

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

相关问题