大佬教程收集整理的这篇文章主要介绍了如何在此 T-SQL 语句中创建计数以获取 INT 值中的结果,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
早上好,
我在 pl/sql 中有这个查询,但是当我声明计数时出现错误,我在声明变量后所做的查询中声明它,我不知道是否必须创建@R_675_10062@一个...
DECLARE @DB_name varchar(100)
DECLARE @Command nvarchar(1000)
DECLARE database_cursor cursOR FOR
SELECT COUNT(Name)
FROM MASTER.sys.sysdatabases
--WHERE name --NOT IN ('master','tempdb','msdb' )
OPEN database_cursor
FETCH NEXT FROM database_cursor INTO @db_name
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT @Command = '
SELECT ''' + @db_name + ''' AS Databasename,''guest'' AS Database_User,[permission_name],[state_desc]
FROM ' +@db_name+ '.sys.database_permissions
WHERE [grantee_principal_ID] = DATABASE_PRINCIPAL_ID(''guest'')
AND [state_desc] liKE ''GRANT%''
AND [permission_name] = ''CONNECT'''
EXEC sp_executesql @Command
FETCH NEXT FROM database_cursor INTO @db_name
END
CLOSE database_cursor
DEALLOCATE database_cursor
错误代码: 消息 102,级别 15,状态 1,第 7 行 '4 附近的语法不正确。
结束时间:2021-06-21T11:45:39.7206852+02:00
我希望能够使用上述查询计算这些值。
您的错误消息来自这样一个事实,即您的光标在每一行中都没有名称,它有一个数据库计数。
这意味着当你创建你的@command 你有这个...
FROM ' +@db_name+ '.sys.database_permissions
=>
FROM 4.sys.database_permissions
显然有一个 4
是没有意义的。
你的光标应该是...
DECLARE database_cursor cursOR FOR
SELECT QUOTename(Name)
FROM MASTER.sys.sysdatabases
--WHERE name --NOT IN ('master','tempdb','msdb' )
如果你想计算权限的数量,并将它们加起来,我会避免使用游标并使用 union all 将多个源表组合成类似这样的东西......
DECLARE @permissions nvarchar(MAX)
DECLARE @Command nvarchar(MAX)
SELECT
@permissions = string_agg(N'SELECT * FROM ' + QUOTename(Name) + '.sys.database_permissions',N' union all ')
FROM
MASTER.sys.sysdatabases
--WHERE name --NOT IN ('master','msdb' )
SELECT
@Command = '
SELECT COUNT(*)
FROM (' + @permissions + ') AS permissions
WHERE [grantee_principal_id] = DATABASE_PRINCIPAL_ID(''guest'')
AND [state_desc] LIKE ''GRANT%''
AND [permission_name] = ''CONNECT''
'
EXEC sp_executesql @Command
(请原谅打字错误,我在打电话。)
,另一种从字面上理解您的查询的方法是使用 union all
和 COUNT
行返回数据集。我在这里使用“旧”FOR XML PATH
方法,因为不知道您是否使用 SQL Server 2017+:
DECLARE @SQL nvarchar(MAX),@CRLF NCHAR(2) = NCHAR(13) + NCHAR(10);
SET @SQL = N'SELECT COUNT(*) AS Users' + @CRLF +
N'FROM (' + @CRLF +
stuFF((SELECT N'union all' + @CRLF +
N'SELECT N' + QUOTename(d.[name],'''') + N' AS Databasename,' + @CRLF +
N' ''guest'' AS Database_User,' + @CRLF +
N' [permission_name],' + @CRLF +
N' [state_desc]' + @CRLF +
N'FROM ' + QUOTename(d.[name]) + '.sys.database_permissions' + @CRLF +
N'WHERE [grantee_principal_id] = DATABASE_PRINCIPAL_ID(''guest'')' + @CRLF +
N' AND [state_desc] LIKE ''GRANT%''' + @CRLF +
N' AND [permission_name] = ''CONNECT'''
FROM sys.databases d
FOR XML PATH(''),TYPE).value('(./text())[1]','nvarchar(MAX)'),1,11,N'') + N') AS c;';
--PRINT @SQL; --Your best friend.
EXEC sys.sp_executesql @SQL;
以上是大佬教程为你收集整理的如何在此 T-SQL 语句中创建计数以获取 INT 值中的结果全部内容,希望文章能够帮你解决如何在此 T-SQL 语句中创建计数以获取 INT 值中的结果所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。