sql-server – 确定SP参数在T-SQL中是否具有默认值

前端之家收集整理的这篇文章主要介绍了sql-server – 确定SP参数在T-SQL中是否具有默认值前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
如果SP的参数具有默认值,有没有办法从sql Server(我在2012年FYI)内确定?这有 other threads,但建议似乎没有准确地告诉我这些信息.

这是我尝试过的几件事;

  1. select *
  2. from sys.objects so join sys.parameters sp on so.object_id = sp.object_id
  3. where so.type='P'
  4. and so.name = 'someSp'

上面的查询返回了一些听起来像我正在咆哮右侧树的列(has_default_value,其中包含default_value)但这些列似乎没有变化,无论我的SP中是否有默认值. (has_default值始终为0,default_value始终为null)

  1. exec sp_sproc_columns 'someSp'

同样的交易;上面的SP返回多个列,包括NULLABLE和IS_NULLABLE;无论我的SP内容如何,​​NULLABLE始终等于1且IS_NULLABLE = YES.

一张纸条; sql Server管理工作室清楚地显示与每个SP参数关联的元数据.

我使用sql事件探查器来检查在Management Studio的对象资源管理器中查看SP的参数时会发生什么.展开参数文件夹时,会运行两个查询.第一个查询在这里粘贴有点长(虽然如果有帮助我会这么做).它包含一个名为DEFAULT VALUE的列;但据我所知,它总是为NULL.第二个查询只返回SP的主体;大概是输出到文本编辑器窗口(虽然我担心在mgmt studio中可能会发生一些解析!)

作为参考/只是为了确保我没有丢失我的弹珠我已经创建了两个无意义的Sps仅用于测试.他们看着像是:

  1. CREATE PROCEDURE TestDefaultSpValue_Default
  2. @I INT = 2
  3. AS
  4. BEGIN
  5. SET NOCOUNT ON;
  6. SELECT @I
  7. END
  8.  
  9. CREATE PROCEDURE TestDefaultSpValue_NoDefault
  10. @I INT
  11. AS
  12. BEGIN
  13. SET NOCOUNT ON;
  14. SELECT @I
  15. END

解决方法

MS sql仅为CLR存储过程和函数存储默认设置,因此在这种情况下只能解析对象定义.
若要运行该示例,您可以创建一个空白存储过程,或采取任何其他过程.
  1. ALTER PROCEDURE dbo.usp_test1
  2. (
  3. @a UNIQUEIDENTIFIER = NULL,@b DATETIME = '20100101',@c DATETIME = DEFAULT,@d BIT = 1,@e BIT,@k INT = 1,@f BIT = 0,@g NVARCHAR(MAX) = '23235',@h INT = 3,@j DECIMAL(10,2) = DEFAULT
  4. )
  5. WITH RECOMPILE
  6. AS
  7. BEGIN
  8.  
  9. PRINT 1;
  10.  
  11. END

查询返回存储过程的默认值列表:

  1. SELECT
  2. data3.name,[default_value] = REVERSE(RTRIM(SUBSTRING(
  3. data3.rtoken,CASE
  4. WHEN CHARINDEX(N',',data3.rtoken) > 0
  5. THEN CHARINDEX(N',data3.rtoken) + 1
  6. WHEN CHARINDEX(N')',data3.rtoken) > 0
  7. THEN CHARINDEX(N')',data3.rtoken) + 1
  8. ELSE 1
  9. END,LEN(data3.rtoken)
  10. )))
  11. FROM (
  12. SELECT
  13. data2.name,rtoken = REVERSE(
  14. SUBSTRING(ptoken,CHARINDEX('=',ptoken,1) + 1,LEN(data2.ptoken))
  15. )
  16. FROM (
  17. SELECT
  18. data.name,ptoken = SUBSTRING(
  19. data.tokens,token_pos + name_length + 1,ISNULL(ABS(next_token_pos - token_pos - name_length - 1),LEN(data.tokens))
  20. )
  21. FROM (
  22. SELECT
  23. sm3.tokens,p.name,name_length = LEN(p.name),token_pos = CHARINDEX(p.name,sm3.tokens),next_token_pos = CHARINDEX(p2.name,sm3.tokens)
  24. FROM (
  25. SELECT
  26. sm2.[object_id],sm2.[type],tokens = REVERSE(SUBSTRING(sm2.tokens,ISNULL(CHARINDEX('SA',sm2.tokens) + 2,0),LEN(sm2.tokens)))
  27. FROM (
  28. SELECT
  29. sm.[object_id],o.[type],tokens = REVERSE(SUBSTRING(
  30. sm.[definition],CHARINDEX(o.name,sm.[definition]) + LEN(o.name) + 1,ABS(CHARINDEX(N'AS',sm.[definition]))
  31. )
  32. )
  33. FROM sys.sql_modules sm WITH (NOLOCK)
  34. JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id]
  35. JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id]
  36. WHERE o.[type] = 'P '
  37. AND s.name + '.' + o.name = 'dbo.usp_test1'
  38. ) sm2
  39. WHERE sm2.tokens LIKE '%=%'
  40. ) sm3
  41. JOIN sys.parameters p WITH (NOLOCK) ON sm3.[object_id] = p.[object_id]
  42. OUTER APPLY (
  43. SELECT p2.name
  44. FROM sys.parameters p2 WITH (NOLOCK)
  45. WHERE p2.is_output = 0
  46. AND sm3.[object_id] = p2.[object_id]
  47. AND p.parameter_id + 1 = p2.parameter_id
  48. ) p2
  49. WHERE p.is_output = 0
  50. ) data
  51. ) data2
  52. WHERE data2.ptoken LIKE '%=%'
  53. ) data3

通过此查询,您可以知道存储过程是否包含任何默认值:

  1. DECLARE @name SYSNAME = 'dbo.usp_test1'
  2.  
  3. IF EXISTS(
  4. SELECT 1
  5. FROM (
  6. SELECT
  7. sm2.[object_id],tokens = SUBSTRING(sm2.tokens,LEN(sm2.tokens))
  8. FROM (
  9. SELECT
  10. sm.[object_id],tokens = REVERSE(SUBSTRING(
  11. sm.[definition],sm.[definition]))
  12. )
  13. )
  14. FROM sys.sql_modules sm WITH (NOLOCK)
  15. JOIN sys.objects o WITH (NOLOCK) ON sm.[object_id] = o.[object_id]
  16. JOIN sys.schemas s WITH (NOLOCK) ON o.[schema_id] = s.[schema_id]
  17. WHERE o.[type] = 'P '
  18. AND s.name + '.' + o.name = @name
  19. ) sm2
  20. ) sm3
  21. WHERE sm3.tokens LIKE '%=%'
  22. ) PRINT @name + ' have default values'

猜你在找的MsSQL相关文章