gpt4 book ai didi

tsql - SQL Server 变量的微妙之处

转载 作者:行者123 更新时间:2023-12-01 07:57:14 27 4
gpt4 key购买 nike

我有以下 SQL Server 存储过程:

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
IF EXISTS (SELECT name
FROM sys.tables
WHERE name = @TmpTableName)
DROP TABLE @TmpTableName; -- This will not work.
GO

这显然行不通(请参阅上面代码段中的评论)。我发现解决这个问题的唯一(也是非常丑陋的)方法是执行以下操作

CREATE PROCEDURE ispsDcOhcAgg @TmpTableName NVARCHAR(50), @ListItem NVARCHAR(50) 
AS
DECLARE @SQL NVARCHAR(4000)
SET @SQL = N'IF EXISTS (SELECT name ' +
N'FROM sys.tables ' +
N'WHERE name = N' + N'''' + @TmpTableName + N''') ' +
N'DROP TABLE ' + @TmpTableName + N';'
EXEC sp_executesql @SQL;
GO

这真的很臭,对于大型存储过程来说,这太可怕了!

还有其他我不知道的方法吗?

感谢您的宝贵时间。

最佳答案

不,如果你想像这样动态使用表名,你需要使用动态SQL。

因此,您应该确保自己不会面临令人讨厌的 SQL 注入(inject)风险!

试试这样的:

SET @SQL = 'IF EXISTS (SELECT name ' +
N'FROM sys.tables ' +
N'WHERE name = @TableName) ' +
N'DROP TABLE ' + QUOTENAME(@TmpTableName) + ';'

EXEC sp_executesql @SQL, N'@TableName sysname', @TmpTableName;

关于tsql - SQL Server 变量的微妙之处,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11470097/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com