转义SQL Server

时间:2016-08-25 00:42:04

标签: sql-server escaping dynamic-sql

我读了this post关于将列名和表名作为变量。 我想要方括号包装列名和表名。我看到有些人这样做:

@sql = 'SELECT [' + @column_name + '] FROM ...'

我试图将方括号放入变量中:

CREATE PROCEDURE [dbo].[find_most_frequent] 
    @table_in VARCHAR,
    @col_2 VARCHAR 
AS
BEGIN 
    DECLARE @sql NVARCHAR(4000);

    SET @sql =
--start of code
'SELECT' +
        @col_2 +
    ' FROM ' + @table_in +
' GO'
--end of code    
    print @sql
    EXEC SP_EXECUTESQL @sql
END 
GO

EXEC [dbo].[find_most_frequent]
        @table_in = '[[]dbo].[[]t1]'
        ,@col_2 = '[[]c1]' 
GO

我已经使用[[]来转义方括号,如here所述。但它确实有效,@ sql是

SELECT[ FROM [ GO

有人可以帮忙吗?谢谢!

2 个答案:

答案 0 :(得分:2)

varchar [(n | max)]

如果未在数据定义或变量声明语句中指定n,则默认长度为1.

https://msdn.microsoft.com/en-AU/library/ms176089.aspx

答案 1 :(得分:1)

关于引用对象名称,SQL Server中有一个函数可以完全执行:quotename()

但要小心,因为当输入超过128个字符时,函数有一个讨厌习惯,即返回c++。引用对象和/或列名称时不会发生这种情况,但在其他情况下可能会触发。